如何使用Kotlin互操作强制执行泛型类型

前端之家收集整理的这篇文章主要介绍了如何使用Kotlin互操作强制执行泛型类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Kotlin中有一个方法,它返回一个通用列表的Rx Observable:
public fun getObservable(): Observable<List<FooBar>> {
    return Observable.just(theList)
}@H_301_3@ 
 

因为Kotlin列表特征被定义为List< out T>,所以Java会将返回类型视为Observable< List<?扩展FooBar>>.

有没有办法告诉Kotlin编译器Java应该将其视为Observable< List< FooBar>>?

http://kotlinlang.org/docs/reference/generics.html

已更新以正确显示问题.

解决方法

编辑:此行为在Kotlin Beta 4中已更改.请参阅Jayson Minard的 answer.

我可以看到两个选项:

>第一种是返回Observable< MutableList< FooBar>>.由于List在kotlin中是不可变的,因此它被声明为List< out T>因为T类型的对象只能从中取出.
另一方面,MutableList是Java的真实List等价物:因为它是可变的,所以它被声明为MutableList< T>.
所以你的功能是:

public fun getObservable(): Observable<MutableList<FooBar>>
        = Observable.just(theList)@H_301_3@ 
 

这个解决方案的问题在于,如果你在kotlin中使用它,如果你只想拥有一个不可变列表的Observable,你就可以对你的列表授予“太多”的访问权限.
>第二个选项是在java中编写一个“代理”方法,使其一劳永逸:

@SuppressWarnings("unchecked")
public static Observable<List<String>> _getObservable() { return (Observable) TestPackage.getObservable(); }@H_301_3@ 
 

这很难看,但它有效,并没有打破kotlin

但是,我假设您正在使用RxJava的Observable,那么为什么不利用这个机会在Java中强制执行kotlin的不可变列表语义?

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);
        }
    });
}@H_301_3@

猜你在找的Java相关文章