如何将一个集合的内容添加到新的集合
我试图覆盖调用超类的方法,并将返回的值添加到一个新的集合(这是必需的,因为超类的返回值是不可变的)。
这个习惯性的Java如下所示:
public class JaxrsApplication extends Application { @Override public Set<Class<?>> getClasses() { HashSet<Class<?>> classes = new HashSet<>(super.getClasses()); classes.add(PlainTextWriter.class); classes.add(PageResource.class); return classes; } }
我试图在Kotlin中实现一个相当于没有成功的方法:
public class JaxrsApplication() : Application() { override fun getClasses(): MutableSet<Class<out Any?>>? { val classes = hashSetOf<Class<out Any?>>() classes.addAll(super.getClasses()) // <= compiler error! classes.add(javaClass<PlainTextWriter>()) classes.add(javaClass<PageResource>()) return classes } }
这似乎是对addAll函数的类型推断问题,但我不知道如何解决它。 帮助赞赏:-)
对于未来的读者,我在这里困惑的原因是由于在错误弹出窗口中的类型不匹配:
MutableSet
实现了Iterable
,这里的关键是最后的'?' “发现”行上的字符表示返回的值是可空的。
你得到编译器错误,因为super.getClasses
返回nullable
类型,但addAll
只接受not-null
参数。
用if-statement
解决这个问题是可能的!!
运营商:
1。
val superClasses = super.getClasses() if (superClasses != null) { classes.addAll(superClasses) }
2。
classes.addAll(super.getClasses()!!)
在Kotlin M9中,你不应该再有这个问题了。 它具有不同类型系统的概念,或者Java和JavaScript平台类型与Kotlin类型不同而且松散的“平台类型”。 因此,您可以在不允许更具体的Kotlin类型的地方使用可能为null的Java平台类型。 例如,Java方法返回一个可能的空值,那么推断的类型将是一个Java平台类型,并且您可以将其传递给其他空白检查被禁用的东西,因为它对于Java是未知的。 如果你没有使用类型推断而专门给它一个Kotlin类型的话,那么你就会强迫它进入更严格的空检查,并且在那一行代码中Kotlin会断言这个值对你来说不是空的(和以前使用的一样!!) 。
所以在M9中,你有两个选择。 让Java类型丢失并导致可能的问题。 或者告诉Kotlin你想把它作为可空或不空,或使用旧! 断言。