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

Generics 如何将一个集合的内容添加到新集合,generics,collections,kotlin,Generics,Collections,Kotlin,我试图重写一个调用超类并将返回值添加到新集合的方法(这是必需的,因为超类的返回值是不可变的) 这方面的惯用Java如下所示: 公共类JAXSApplication扩展了应用程序{ @重写公共集>类=新哈希集(super.getClasses()); 添加(PlainTextWriter.class); 添加(PageResource.class); 返回类; } } 我正在尝试在Kotlin中实现一个等效项,但没有成功: public类JaxrsApplication():Applicatio

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

这方面的惯用Java如下所示:

公共类JAXSApplication扩展了应用程序{
@重写公共集>类=新哈希集(super.getClasses());
添加(PlainTextWriter.class);
添加(PageResource.class);
返回类;
}
}
我正在尝试在Kotlin中实现一个等效项,但没有成功:

public类JaxrsApplication():Application(){
重写fun getClasses():MutableSet{
val classes=hashSetOf()

classes.addAll(super.getClasses())/由于
super.getClasses
返回
null
类型,但
addAll
只接受
非null
参数,因此会出现编译器错误

可以使用
if语句或
!!
运算符解决此问题:

一,

二,


在Kotlin M9中,您不应该再有这个问题了。它有不同类型系统或“平台类型”的概念Java和JavaScript平台类型与Kotlin类型不同且更松散。因此,您可以在不允许使用更具体Kotlin类型的地方使用可能为null的Java平台类型。例如,Java方法返回可能为null的值,则推断的类型将是Java平台类型,您可以传递它如果您在不使用类型推断的情况下专门为它指定了一个Kotlin类型,那么您将强制它进行更严格的null检查,并且在代码行Kotlin将声明您的值不是null(与前面使用的!!)

因此,在M9中,您有两个选择。让Java类型丢失并导致可能的问题。或者告诉Kotlin您希望将其具体视为可空或不可空,或者使用旧的!!断言

val superClasses = super.getClasses()
if (superClasses != null) {
    classes.addAll(superClasses)
}
classes.addAll(super.getClasses()!!)