2014-10-04 449 views
0

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

惯用的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; 
    } 
} 

我试图实现科特林没有成功等价物:

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函数,但我不知道如何解决它。帮助表示赞赏:-)


对于未来的读者,我在这里混淆的原因是由于错误弹出的类型不匹配:

error pop-up

MutableSet实现Iterable,这里的关键是最后的'?' 'Found'行中的字符表示返回的值是可空的。

回答

1

您收到编译器错误,因为super.getClasses返回nullable类型,但addAll只接受not-null参数。

有可能与if-statement!!运营商解决这个问题:

1.

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

2.

classes.addAll(super.getClasses()!!) 
0

在科特林M9你不应该有这个问题了。它具有不同类型系统的概念,或者说Java和JavaScript平台类型与Kotlin类型不同而且松散的“平台类型”。因此,您可以在不允许更具体的Kotlin类型的地方使用可能为null的Java平台类型。例如,Java方法返回一个可能为空的值,那么推断的类型将是Java平台类型,并且您可以将其传递给其他空白检查被禁用的东西,因为它对于Java而言是未知的。如果你没有使用类型推断专门给它一个Kotlin类型,那么你就会强制它进入更严格的空检查,并且在那行代码中Kotlin会断言这个值对你而言不是空的(与以前使用的一样!) 。

所以在M9中,你有两个选择。让Java类型丢失并导致可能的问题。或者告诉Kotlin您希望将它专门视为可为空或不为空,或者使用旧的!断言。