为什么这个泛型方法调用不起作用?

Gee*_*eek 1 java generics effective-java

以下代码来自Effective Java book:

Set<Integer> integers = ... ;
Set<Double> doubles = ... ;
Set<Number> numbers = union(integers, doubles);
Run Code Online (Sandbox Code Playgroud)

这段代码没有编译,作者建议通过告诉编译器确切的类型来解决这个问题,如下所示:

Set<Number> numbers = Union.<Number>union(integers, doubles)
Run Code Online (Sandbox Code Playgroud)

如果联合的签名如下,为什么早期的程序不能编译?这个特定的解决方法成语是什么?

public static <E> Set<E> union(Set<? extends E> s1,
Set<? extends E> s2)
Run Code Online (Sandbox Code Playgroud)

小智 5

请注意,Double和Integer不仅扩展了Number,还实现了Comparable.因此编译器猜测的返回类型将是Set <Number&Comparable>,它不能转换为Set <Number>.您需要告诉编译器使用哪种类型.使用以下代码,您不需要确切的类型.

interface X {}
class U implements X {}
class V implements X {}

public static void main(String[] args) {
    Set<U> integers = new HashSet<U>();
    Set<V> doubles = new HashSet<V>();
    Set<X> numbers = union(integers, doubles);
}
public static <E> Set<E> union(Set<? extends E> s1,   Set<? extends E> s2) {
    return null;

}
Run Code Online (Sandbox Code Playgroud)

但是如果你稍微改一下,你就会得到原点错误.

   interface X {}
interface Y {}
class U implements X, Y {}
class V implements X, Y {}

public static void main(String[] args) {
    Set<U> integers = new HashSet<U>();
    Set<V> doubles = new HashSet<V>();
    Set<X> numbers = union(integers, doubles);
}
public static <E> Set<E> union(Set<? extends E> s1,   Set<? extends E> s2) {
    return null;

}
Run Code Online (Sandbox Code Playgroud)