假设:
public static <T> void copy(List<? super T> dest, List<? extends T> src)
我看过这个页面: Confusion over Java generic method type inference
但我仍然感到困惑,dasblinkenlight说只要您传入的Object是一致的,那么代码应该编译。
这是否意味着第一个参数类型将有助于确定什么是有效的 对于第二个?
public class Hello {
public static void main(String[] args){
ArrayList<Animal> dogs = new ArrayList<>();
ArrayList<Marly> marlies = new ArrayList<>();
copy(dogs,marlies);
}
public static <T> void copy(List<? super T> dest, List<? extends T> src{
}
}
class Animal{}
class Dog extends Animal { }
class Beagle extends Dog { }
class Marly extends Beagle{ }
几乎每个我改变的方式都围绕它编译的这两个列表,只要第一个在继承层次结构中更高。
有人可以帮助解释一下吗
答案 0 :(得分:0)
方法签名使用两个不同的通配符:
<? super T>
<? extends T>
此处解释的差异:Difference between <? super T> and <? extends T> in Java
每次调用此方法时,java编译器都会尝试查找T,以便两个参数都满足其条件。看来,当有多个选择时,编译器会选择最具体的T。
所以
// fails because there is no superclass of Dog that is a subclass of Animal
copy(new ArrayList<Dog>(), new ArrayList<Animal>())
// chooses T = Marly because it is most specific solution
copy(new ArrayList<Animal>(), new ArrayList<Marly>())