有人可以解释这些java泛型方法的声明吗?

Ton*_*one 9 java generics declaration

我正在阅读Gilad Bracha撰写的"Java编程语言中的泛型",我对一种声明风格感到困惑.以下代码位于第8页:

interface Collection<E> 
{ 
    public boolean containsAll(Collection<?> c); 
    public boolean addAll(Collection<? extends E> c); 
} 


interface Collection<E> 
{ 
    public <T> boolean containsAll(Collection<T> c);
    public <T extends E> boolean addAll(Collection<T> c); 
    // hey, type variables can have bounds too! 
} 
Run Code Online (Sandbox Code Playgroud)

我的困惑来自第二次宣言.我不清楚<T>声明在以下行中的用途是什么:

    public <T> boolean containsAll(Collection<T> c);
Run Code Online (Sandbox Code Playgroud)

该方法已经有一个与之关联的类型(布尔值).

为什么要使用它<T>以及它对编码器有什么作用?

我认为我的问题需要更具体一些.

你为什么要写:

  public <T> boolean containsAll(Collection<T> c);
Run Code Online (Sandbox Code Playgroud)

VS

  public boolean containsAll(Collection<T> c);
Run Code Online (Sandbox Code Playgroud)

<T>在containsAll的第一个声明中,我不清楚,目的是什么.

Mar*_*ers 3

据我所知,在这种情况下<T>根本没有提供任何有用的东西。它创建的方法在功能上与使用通配符的方法完全等效。

以下是一些有用的示例:

public List<?> transform(List<?> in);
//vs
public <T> List<T> transform(List<T> in);
Run Code Online (Sandbox Code Playgroud)

在上面,您可以将返回类型与输入类型相关联。第一个示例无法关联两个通配符的运行时类型。

public void add(List<?> list, Object obj);
//vs
public <T> void add(List<? super T> list, T obj);
Run Code Online (Sandbox Code Playgroud)

在上面,第一个方法甚至无法添加,obj因为list它不能被认为是类型安全的。第二个中的通用参数确保list可以容纳任何类型obj