Java 如何使用Kotlin interop强制执行泛型类型

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

我在Kotlin中有一个方法,它返回一个通用列表的Rx可观测值:

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)
}