如何使用Kotlin中不可为null的元素的Java集合?

如何使用Kotlin中不可为null的元素的Java集合?,java,collections,kotlin,interop,non-nullable,Java,Collections,Kotlin,Interop,Non Nullable,使用Kotlin为nullability提供的互操作自动化功能,类似这样的方法可以在Kotlin中获得正确的签名: @NonNull 公共字符串foo(@NonNull字符串条){ 返回“bar”; } 现在把这个原理推广到集合(我想是其他泛型): @NonNull 公共集合foo(@NonNull集合栏){ 返回新的HashSet(); } 这在Kotlin中显示为 foo(条:(可变)集合):(可变)集合 我可以使用(可变),但是如何在类型参数中去掉平台类型呢?也就是说,如何编写或注释

使用Kotlin为nullability提供的互操作自动化功能,类似这样的方法可以在Kotlin中获得正确的签名:

@NonNull
公共字符串foo(@NonNull字符串条){
返回“bar”;
}
现在把这个原理推广到集合(我想是其他泛型):

@NonNull
公共集合foo(@NonNull集合栏){
返回新的HashSet();
}
这在Kotlin中显示为

foo(条:(可变)集合):(可变)集合
我可以使用
(可变)
,但是如何在类型参数中去掉平台类型呢?也就是说,如何编写或注释Java函数,以便从Kotlin中看到
Set
(或者
Set

不允许使用
Set
(“@NonNull”不适用于类型使用”)


如果有区别,我会使用Findbugs注释(通过Spotbugs)。我的观点是(Java)库提供商希望尽可能无缝地使用Kotlin。

结果证明,这是我使用的注释的实现问题,而不是概念问题

从Spotbugs注解3.1.2开始,注解
@NotNull
@NonNull
没有为目标
ElementType.TYPE\u USE
声明

使用该标志声明,以便在类型参数上使用:

@NotNull
公共集合foo(@NotNull集合栏){
返回新的HashSet();
}
虽然这在Java中看起来有点笨拙,但我们得到了所需的Kotlin签名:

foo(条:(可变)集合):(可变)集合
注意,注释类型参数需要源语言级别的Java 8+



关于Android和其他被困在低语言水平的情况的说明。由于注释具有保留级别
,因此,如果应用程序使用这样注释的库,我预计不会出现任何运行时问题。不过,我还没有测试过它;感谢您的评论。

意味着它成为类的一部分,运行时必须加载和解释该类,然后才丢弃它,以便通过反射不可用。具有这些注释的类(我想)必须具有格式版本号52或更高,Android可能会拒绝这些版本。@MarkoTopolnik我想它可以忽略所有的类注释,但可能不会。您关于格式版本的观点是有效的;我没有足够的Android发货经验来估计这里的问题。我想这取决于你想要支持的Android版本吧?4.4仍然存在很多,但很古老。:/无论如何,我无法(通过谷歌搜索)发现(现代)Android是否支持类型注释。不要让Android Studio方便尝试,所以最好把它看作是JVM唯一的答案。Android与JDK 7兼容,所以它很可能对JDK 8类格式的库进行抱怨。不过,对于这一点,可能有一些变通办法,比如为开发时依赖项和APK单独构建。@MarkoTopolnik我一直对谷歌的策略感到困惑(和恼怒)。我可能会给你回复那些解决办法!现在,FWIW,我就这个问题提出了一个建议。感谢您的反馈!
@NonNull
public Set<String> foo(@NonNull Collection<String> bar) {
    return new HashSet<String>();
}