如何使用 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<String?>
,但是为什么预期的类型不一样呢?为什么 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 互操作处理可为空的泛型的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 typeorm 将可为空的数据库字段设置为 NULL?
如何使用 ToString() 格式化可为空的 DateTime?