public <T extends Animal> void addAll(List <T> animals)和public void addAll(List <Animal> animals)有什么区别?

sec*_*ret 4 java generics

我对此感到有点困惑,所以我会对此表示赞赏.

public <T extends Animal> void addAll(List<T> animals)
Run Code Online (Sandbox Code Playgroud)

public void addAll(List<Animal> animals)
Run Code Online (Sandbox Code Playgroud)

rge*_*man 10

不同之处在于该List方法将接受哪些类型参数.

在第一种方法中,T可以是Animal或任何子类,因此addAll将接受a List<Animal>,a List<Dog>或a List<Cat>.请注意,此签名相当于

public void addAll(List<? extends Animal> animals)
Run Code Online (Sandbox Code Playgroud)

当你不需要Animal方法体中的确切类型时.

在第二种方法中,您已指定type参数必须为Animal.Java的泛型是不变的,因此不允许任何子类型Animal.此方法将接受a List<Animal>,但不接受a List<Dog>或a List<Cat>.