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();
//...
}
假设我有层次结构:
- Apple.class -> Fruit.class (Apple是Fruit类的子类型)
- Apple.class -> IMakeJuice.class (Apple是IMakeJuice接口的子类型)
和我执行:
List<Object> objList = new ArrayList<Object>();
List<Apple> appleList = new ArrayList<Apple>();
Collections.copy(objList, appleList);
将T转换为Fruit
, IMakeJuice
, Object
或Apple
吗?
它将是满足边界的最具体类型,即T
将是Apple
。
引用https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
推理算法试图找到与所有参数都适用的最特定的类型。
正如Andy Turner已经回答的那样,T
将成为Apple
。
如果您在任何.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
版本。