如何在java中转换泛型?

时间:2012-03-20 03:26:37

标签: java generics

在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接口的具体类,所以最合适的无缝转换方式是什么?

2 个答案:

答案 0 :(得分:2)

类型为Set<A>的变量只能包含Set<A>个对象,而不是Set<B>,即使BA的子类型。

原因是:如果您在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;
    }
}