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的第一个声明中,我不清楚,目的是什么.
据我所知,在这种情况下<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。