Java泛型设置联合构造

时间:2016-01-18 10:43:51

标签: java generics casting

为什么编译器显示“无法从Set< Number& Comparable<?>>转换为Set< Number>”在变量“numbers3”?

    public static <E> Set<E> union (Set<? extends E> s1, Set<? extends E> s2) 
    {
        Set<E> temp = new HashSet<E>();

        temp.addAll(s1);
        temp.addAll(s2);

        return temp;
    }


    public static void main(String[] args) 
    {
        Set<Integer> integers = new HashSet<Integer>();
        integers.add(123);

        Set<Double> doubles = new HashSet<Double>();
        doubles.add(456.78);

        Set<Number> numbers1 =  TestClass.<Number>union(integers, doubles);
        Set<? extends Number> numbers2 =  TestClass.union(integers, doubles);
//      Set<Number> numbers3 =  (Set<Number>) (TestClass.union(integers, doubles)); <- Why does this not compile ?

        System.out.println(numbers1 + ", " + numbers2 + ", " /* + numbers3 */);
    }

感谢。

1 个答案:

答案 0 :(得分:0)

  

无法从Set<Number&Comparable<?>>投射到Set<Number>

意味着,首先,没有任何其他信息,编译器推断TestClass.union的返回类型应该是Set<Number&Comparable<?>>,这只是编译器可以管理的最窄类型。

另一方面,一般来说,您无法从Set<SubFoo>投射到Set<Foo>。这样就可以将Foo添加到Set<SubFoo>,这会很糟糕。所以编译器实际上并没有允许该演员。

所有这些意味着你需要做一些不同的事情来使编译器的类型推断变得快乐,你已经清楚地知道如何去做。