Double と Integer は Number を拡張するだけでなく、Comparable も実装することに注意してください。したがって、コンパイラによって推測される戻り値の型は、Set<Number> にキャストできない Set<Number&Comparable> になります。次のタイプのどれを使用するかをコンパイラに伝える必要があります。次のコードでは、正確な型は必要ありません。
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;
}
ただし、少し変更すると、原点エラーが発生します。
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;
}