什么是T的类型

时间:2017-08-10 20:26:44

标签: java generics

假设:

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{ }

几乎每个我改变的方式都围绕它编译的这两个列表,只要第一个在继承层次结构中更高。

有人可以帮助解释一下吗

1 个答案:

答案 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>())