如何使用Java Interop处理可为空的泛型

时间:2018-08-27 17:48:15

标签: kotlin kotlin-interop

我有一个不受控制的Java类,定义为:

public @interface ValueSource {
    String[] strings() default {}
}

我正在尝试通过我控制的Kotlin文件使用此类,

class Thing {
    @ValueSource(string = ["non-null", null])
    fun performAction(value: String?) {
        // Do stuff
    }
}

我收到编译器错误

Kotlin: Type inference failed. Expected type mismatch: inferred type is Array<String?> but Array<String> was expected.

我理解为什么推断的类型是Array<String?>,但是为什么预期的类型不一样?为什么Kotlin将Java泛型解释为String!而不是String??最后,有没有办法抑制错误?

科特林1.2.61

1 个答案:

答案 0 :(得分:4)

这不是Kotlin的问题-此代码也无效,因为Java根本不允许注释参数中的null值:

public class Thing {

    @ValueSource(strings = {"non-null", null}) // Error: Attribute value must be constant
    void performAction(String value) {
        // Do stuff
    }

}

有关此问题的更多讨论,请参见this articlethis question