我在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@