Collections
类有静态方法copy
:
public static <T> void ...copy(List<? super T> dest, List<? extends T> src) {
//...
ListIterator<? super T> di=dest.listIterator();
ListIterator<? extends T> si=src.listIterator();
//...
}
假设我有hierarhy:
我执行:
List<Object> objList = new ArrayList<Object>();
List<Apple> appleList = new ArrayList<Apple>();
Collections.copy(objList, appleList);
是否可以投放到Fruit
,IMakeJuice
,Object
或Apple
?
答案 0 :(得分:3)
它将是满足边界的最具体的类型,即T
将是Apple
。
引用https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html:
推理算法试图找到适用于所有参数的最具体类型。
答案 1 :(得分:1)
正如Andy Turner已经回答的那样,T
将是Apple
。
对于其他类似的问题,您的IDE可以告诉您。我使用Eclipse,但我认为其他人也会这样做。
如果将以下内容添加到任何.java文件中:
class Test {
void test() {
List<Object> objList = new ArrayList<Object>();
List<Apple> appleList = new ArrayList<Apple>();
Collections.copy(objList, appleList);
}
}
class Fruit {}
interface IMakeJuice {}
class Apple extends Fruit implements IMakeJuice {}
然后将鼠标悬停在copy
上,或点击并按F2键,它会显示解析T
的javadoc,包括方法定义:
<Apple> void java.util.Collections.copy(List<? super Apple> dest, List<? extends Apple> src)
这对于识别调用多个重载方法中的哪一个非常有用,例如: String.valueOf(1)
和String.valueOf((short)1)
都会调用int
版本,而String.valueOf(1.0)
会调用double
版本。