如何将一个集合的内容添加到新的集合

我试图覆盖调用超类的方法,并将返回的值添加到一个新的集合(这是必需的,因为超类的返回值是不可变的)。

这个习惯性的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你想把它作为可空或不空,或使用旧! 断言。