List<String>
不是List<Object>
。由于在List<String>
中插入一个Integer
是无效的,所以List<String>
也不是List<Object>
。但是,有些类型可以进行协变类型转换。给定类A、B和Producer:
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<Object>
,并防止无效的转换,比如将Producer<A>
转换为Producer<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<Producer<Object>>
。
Producer<Producer<A>> producerOfA = new Producer<Producer<A>>();
Producer<Producer<Object>> producerOfObjects =
Types.<Producer<Object>> cast(producerOfA); //does not compile
有没有一种方法可以说服Java类型系统在用户代码中执行这样有效的类型转换,而不会出现警告?