如何使用Kotlin互操作强制执行泛型类型
我在Kotlin中有一个方法,它返回一个通用列表的Rx Observable:
public fun getObservable(): Observable<List<FooBar>> { return Observable.just(theList) } 因为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类型的对象只能从中取出. public fun getObservable(): Observable<MutableList<FooBar>> = Observable.just(theList) 这个解决方案的问题在于,如果你在kotlin中使用它,如果你只想拥有一个不可变列表的Observable,你就可以对你的列表授予“太多”的访问权限. @SuppressWarnings("unchecked") public static Observable<List<String>> _getObservable() { return (Observable) TestPackage.getObservable(); } 这很难看,但它有效,并没有打破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); } }); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |