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

标签 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! 
} 

我的困惑点来自第二个声明。我不清楚 <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/

相关文章:

java - 输出中没有出现字母?

java - 在应用程序启动期间验证 @Value 注释的字段

java - 如何构造通用可变参数的 EnumSet?

c - 我在 C 中声明了一个变量。编译器如何为变量分配内存空间?

java - Android - 在文本文件中追加特定行

java - 带组的字符串正则表达式

java - 为什么泛型类型和通配符类型输出结果不同

java - 使用 CriteriaBuilder 时编译错误

ios - 关于一行中连续声明的 Swift 错误

C++ 我需要为一个函数到处写 throw 子句吗?