如何使用 Java 互操作处理可为空的泛型

Posted

技术标签:

【中文标题】如何使用 Java 互操作处理可为空的泛型【英文标题】:How to handle nullable generics with Java interop 【发布时间】:2018-08-27 17:48:15 【问题描述】:

我有一个不受我控制的 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&lt;String?&gt;,但是为什么预期的类型不一样呢?为什么 Kotlin 将 Java 泛型解释为 String! 而不是 String??最后,有没有办法抑制错误?

科特林 1.2.61

【问题讨论】:

【参考方案1】:

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

public class Thing 

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


有关此问题的更多讨论,请参阅 this article 和 this question。

【讨论】:

以上是关于如何使用 Java 互操作处理可为空的泛型的主要内容,如果未能解决你的问题,请参考以下文章

如何识别泛型类型的可为空引用类型?

可空引用类型:如何指定“T?”类型不限于类或结构

如何使用 typeorm 将可为空的数据库字段设置为 NULL?

如何使用 ToString() 格式化可为空的 DateTime?

将 int.TryParse 与可为空的 int 一起使用 [重复]

如何将 int.TryParse 与可为空的 int 一起使用? [复制]