加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:57:01 所属栏目:Java 来源:网络整理
导读:我在Kotlin中有一个方法,它返回一个通用列表的Rx Observable: public fun getObservable(): ObservableListFooBar { return Observable.just(theList)} 因为Kotlin列表特征被定义为List out T,所以Java会将返回类型视为Observable List?扩展FooBar. 有没有
我在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类型的对象只能从中取出.
另一方面,MutableList是Java的真实List等价物:因为它是可变的,所以它被声明为MutableList< T>.
所以你的功能是:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读