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;
    }
}

我试图在 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,这里的关键是最后的'?' 'Found' 行上的字符表示返回的值可以为空。

4

2 回答 2

2

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

if-statement可以使用or运算符解决此问题!!

1.

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

2.

classes.addAll(super.getClasses()!!)
于 2014-10-04T16:23:17.303 回答
0

在 Kotlin M9 中,您应该不再有这个问题。它具有不同类型系统或“平台类型”的概念,其中 Java 和 JavaScript 平台类型与 Kotlin 类型不同且更宽松。因此,您可以在不允许使用更具体的 Kotlin 类型的地方使用可能为空的 Java 平台类型。例如,Java 方法返回一个可能为 null 的值,那么推断的类型将是 Java 平台类型,并且您可以将其传递给由于 Java 未知而禁用 null 检查的其他事物。如果你在不使用类型推断的情况下专门给它一个 Kotlin 类型,那么你就是在强制它进行更严格的 null 检查,并且在该行代码中,Kotlin 将为你断言该值不为 null(与之前使用的相同!!) .

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

于 2014-10-16T11:07:39.467 回答