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)
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |