2017-02-10 104 views
1

我尝试和失败(或部分成功)来实现扩展功能LocalDateTimeLocalDateTime扩展功能和智能铸件

这里是我的尝试:

fun LocalDateTime.isNotBefore(other: ChronoLocalDateTime<*>) = !isBefore(other) 

的问题是的IntelliJ抱怨说,它不能smartcast我的curTime变量(这是一个valLocalDateTime?

isNotBefore(curTime)将有一个红色的波浪线和抱怨吨它无法对其进行智能广播。所以我必须使用!!

不用担心,如果你不能复制它,我有很多代码 - 这些是重要的部分。

区别在于像isBefore()这样的常规LocalDateTime方法在这个位置不需要smartcast。

所以这意味着我没有在我的扩展功能中正确实现某些东西。

有谁知道我该如何修复扩展功能,以便我不需要使用!!

回答

3

如果仔细查看isBefore签名,它预计为ChronoLocalDateTime<*>!类型。这是Platform Type的kotlin符号。感叹号意味着它期望ChronoLocalDateTime<*>ChronoLocalDateTime<*>?而您的isNotBefore方法预计不可空类型。

如果您将扩展函数更改为接受空值,它将以同样的方式工作。

fun LocalDateTime.isNotBefore(other: ChronoLocalDateTime<*>?) = !isBefore(other) 
+0

伟大的,我试图做到这一点,但放弃了,因为我不知道符号(我也遇到了困难搜索'!'在谷歌:) – ycomp