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

支持Java中的协变类型转换

发布时间:2020-12-15 05:04:00 所属栏目:Java 来源:网络整理
导读:Java类型系统仅支持不变类型.所以List String不是List Object.列表 String不是List Object因为将整数插入List String无效.但是,存在这种协变类型转换有效的类型. 鉴于A,B和生产者类别: class A{}class B{}interface ProducerT { T next();} 可以定义协变类
Java类型系统仅支持不变类型.所以List< String>不是List< Object>.列表< String>不是List< Object>因为将整数插入List< String>无效.但是,存在这种协变类型转换有效的类型.

鉴于A,B和生产者类别:

class A{}
class B{}
interface Producer<T> {
    T next();
}

可以定义协变类型Producer的强制转换:

class Types{
    @SuppressWarnings("unchecked")
    public static <T> Producer<T> cast(Producer<? extends T> producer){
        return (Producer<T>) producer;
    }
}

该方法支持从Producer< A>进行强制转换.生产者<对象>并防止像Producer< A>这样的无效演员表制片人< B>:

Producer<Object> valid = Types.<Object> cast(new Producer<A>());
Producer<A> invalid = Types.<A> cast(new Producer<B>()); //does not compile

我的问题是我无法从Producer< Producer< A>>执行演员表生产者< Producer< Object>>.

Producer<Producer<A>> producerOfA = new Producer<Producer<A>>();
Producer<Producer<Object>> producerOfObjects = 
   Types.<Producer<Object>> cast(producerOfA); //does not compile

有没有办法说服Java类型系统在用户代码中没有警告的情况下执行这种有效的类型转换?

解决方法

您还没有发布Producer的代码,但是根据名称和断言它应该是协变的,也许你现在说的任何地方:

Producer<Foo>

你应该说:

Producer<? extends Foo>

如果Java会自动意识到通用接口等同于其通配形式(例如Iterator和Iterable也是安全协变的),那将是很好的,但至少现在,它不会.

(编辑:李大同)

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

    推荐文章
      热点阅读