Java 如何使用Kotlin interop强制执行泛型类型
我在Kotlin中有一个方法,它返回一个通用列表的Rx可观测值:Java 如何使用Kotlin interop强制执行泛型类型,java,generics,interop,kotlin,Java,Generics,Interop,Kotlin,我在Kotlin中有一个方法,它返回一个通用列表的Rx可观测值: public fun getObservable(): Observable<List<FooBar>> { return Observable.just(theList) } public fun getObservable():Observable{ 返回可观察。仅(列表) } 由于Kotlin列表特征被定义为list,Java将返回类型视为Observable编辑:Kotlin Beta
public fun getObservable(): Observable<List<FooBar>> {
return Observable.just(theList)
}
public fun getObservable():Observable{
返回可观察。仅(列表)
}
由于Kotlin列表特征被定义为
list
,Java将返回类型视为Observable编辑:Kotlin Beta 4中的这种行为已经改变。见杰森·米纳德。
我可以看到两种选择:
- 第一个是返回一个
可观察的
。由于列表
在kotlin中是不可变的,因此它被声明为列表
,因为T类型的对象只能从中取出。
MutableList
另一方面是Java真正的List
等价物:因为它是可变的,所以声明为MutableList
因此,您的功能将是:
public fun getObservable(): Observable<MutableList<FooBar>>
= Observable.just(theList)
您可以使用JvmWildcard
和jvmsuppresswildcard
注释控制Java如何看待Kotlin泛型。它是在Kotlin 1.0 Beta 4中添加的(请参阅)
此更改意味着您的代码将已经更改为ok,并且不再生成通配符。因为新的默认设置是在许多情况下不使用它们,并且您可以使用注释将它们带回来,或者在不需要时抑制它们
该变更的公告声明如下:
Java通配符
Kotlin如何翻译变量类型存在一些问题,例如,列表应该是Java中的列表还是简单的列表。撇开细节不谈,我们做了以下工作:
- 默认情况下,我们不会在返回类型和没有意义的地方生成通配符
- 当需要通配符时,可以使用类型注释强制其存在:Java中的List始终是List
- 当我们需要去掉通配符时,我们可以使用@jvmsuppresswidcards(这可以用于类型或包含它的任何声明)
示例:
fun-foo(l:List)//在Java:List中(字符串是最终的)
fun foo(l:List)//在Java:List中,解决这个问题的一种方法是使用MutableList
,但是如果getList()
请求一个不可变的返回类型,这就没用了。难道你不能简单地用Java强制转换吗?是的,这是可能的,但是我不希望这种情况下的每个实例都使用强制转换。另外,这个问题更多的是对Kotlin在这种情况下的语言启示的好奇代码>所以我看不出你描述的问题。你是对的@Salomonbris。我更新了这个问题,我喜欢第一个选项,因为java.util.List是可变的,但是我喜欢第三个选项,因为我看到我们将更多的代码迁移到Kotlin。谢谢此行为已更改,请参见。
@SuppressWarnings("unchecked")
public static Observable<List<String>> _getObservable() { return (Observable) TestPackage.getObservable(); }
public static Observable<List<String>> _getObservable() {
return TestPackage.getObservable().map(new Func1<List<? extends String>, List<String>>() {
@Override
public List<String> call(List<? extends String> list) {
return Collections.unmodifiableList(list);
}
});
}
fun foo(l: List<String>) // in Java: List<String> (String is final)
fun foo(l: List<@JvmWildcard String>) // in Java: List<? extends String>
interface Open {}
fun bar(p: List<Open>) // in Java: List<? extends Open> (Open is not final)
@JvmSuppressWildcards
fun bar(p: List<Open>) // in Java: List<Open>
@JvmSuppressWildcards
public fun getObservable(): Observable<List<FooBar>> {
return Observable.just(theList)
}