我正在阅读 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!
}
我的困惑点来自第二个声明。我不清楚 <T>
的目的是什么声明服务于以下行:
public <T> boolean containsAll(Collection<T> c);
该方法已经有一个与之关联的类型( boolean 值)。
为什么要使用 <T>
它告诉编译器什么?
我认为我的问题需要更具体一些。
为什么要写:
public <T> boolean containsAll(Collection<T> c);
对比
public boolean containsAll(Collection<T> c);
我不清楚 <T>
的目的是什么是,在 containsAll 的第一个声明中。
最佳答案
据我所知,在这种情况下 <T>
根本不提供任何有用的东西。它创建了一个在功能上完全等同于使用通配符的方法。
下面是一些会有用的例子:
public List<?> transform(List<?> in);
//vs
public <T> List<T> transform(List<T> in);
在上面,您可以将返回类型与输入类型相关联。第一个示例无法关联两个通配符的运行时类型。
public void add(List<?> list, Object obj);
//vs
public <T> void add(List<? super T> list, T obj);
在上面,第一种方法甚至不能添加obj
。至 list
因为它不能被认为是类型安全的。第二个中的通用参数确保 list
可以容纳任何类型 obj
是。
关于java - 有人可以解释这些 java 泛型方法的声明吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4692504/