支持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也是安全协变的),那将是很好的,但至少现在,它不会. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |