在java中转换泛型的正确方法是什么?
interface A {
}
class B implements A {
}
class C {
public Set<B> returnSomeB(){
//some logic
}
}
C c = new C();
Set<A> = c.returnSomeB();
Set<A> = c.returnSomeB();
这一行会给我一个编译时错误,因为B类是A接口的具体类,所以最合适的无缝转换方式是什么?
答案 0 :(得分:2)
类型为Set<A>
的变量只能包含Set<A>
个对象,而不是Set<B>
,即使B
是A
的子类型。
原因是:如果您在Set<B>
变量中存储Set<A>
对象,然后向其中添加A
类型的对象(但不是B
),该怎么办? ?它适合所有正确的参数类型,但最终结果将违反Java的类型安全性。
要解决此问题,您可以使用通配符。而不是声明类型为Set<A>
的变量,而是声明Set<? extends A>
类型的变量。
答案 1 :(得分:0)
尝试将您的类型参数绑定到可接受值的最宽范围:
interface A {
}
interface B extends A {
}
class C {
public static void main(String[] args) {
final Set<A> foo = C.returnSomeB();
final Set<B> bar = C.returnSomeB();
}
public static <T extends A> Set<T> returnSomeB() {
return null;
}
}