Java 方法类型参数在签名中只使用一次-是否有意义?

Java 方法类型参数在签名中只使用一次-是否有意义?,java,generics,Java,Generics,本教程提供了以下有用的示例: public <T extends E> boolean addAll(Collection<T> c); public boolean addAll(集合c); 但是,[…]类型参数T只使用一次。返回类型 不依赖于类型参数,也不依赖于 方法(在本例中,只有一个参数)。[...] 如果是这样,就应该使用通配符 我正在研究的项目的代码库有以下几种方法: public <T extends Something> T getT

本教程提供了以下有用的示例:

 public <T extends E> boolean addAll(Collection<T> c); 
public boolean addAll(集合c);
但是,[…]类型参数T只使用一次。返回类型 不依赖于类型参数,也不依赖于 方法(在本例中,只有一个参数)。[...] 如果是这样,就应该使用通配符

我正在研究的项目的代码库有以下几种方法:

public <T extends Something> T getThing();
publictgetthing();
和(不在同一界面中)

publicsvoidstoredata(int-id,D数据);
使用方法类型参数而不是直接使用绑定(
上面的某物
下面的对象
)有什么意义吗

(请注意,在前一种情况下,所有少数实现都用
@SuppressWarnings(“unchecked”)
注释,重点可能是对方法的用户隐藏此警告,但我不确定这是值得称赞的成就。 在后一种情况下,一些实现使用反射以不同的方式存储不同类的实例,但我看不出类型参数如何促进这一点。)

第一个-

public <T extends Something> T getThing();


有五种不同类型的类型参数只出现一次考虑。

1) 一旦处于返回类型位置:

1.a)返回类型是类型变量

public <T extends Something> T getThing();
注意,实现实际上需要type参数来洗牌元素。尽管如此,打电话的人不必为此烦恼。您可以编写“捕获”通配符的内部帮助器方法:

public static void shuffle(List<?> list) {
  shuffleWithCapture(list);
}

private static <E> void shuffleWithCapture(List<E> list) {
  // implementation
}
publicstaticvoidshuffle(列表){
shuffleWithCapture(列表);
}
私有静态无效shuffleWithCapture(列表){
//实施
}
2.b)具有多个边界的类型参数

public static <T extends Foo & Bar> void foo(T);
public static <E extends Foo & Bar> void foo(List<E>);
publicstaticvoidfoo(T);
公共静态无效foo(列表);
由于Java除了在类型参数范围内之外,不允许在任何地方使用交集类型,因此这是表示这些签名的唯一方法

2.c)类型参数绑定包含类型参数变量

public static <T extends Comparable<? super T>> void sort(List<T> list);

publicstaticerm…我完全忘记了
storeData
的返回类型,实际上是
void
。我完全明白像“D方法(D输入)”这样的签名的意义,但是
D
不会是我要求的“仅使用一次的类型参数”。但是,如果它在类型参数的返回位置出现一次,那么它是完全合理的。e、 g.
公共列表获取()
另外,另一种情况是递归有界类型变量,如用于capture aux方法技术的
+1,以及用于提及交叉点类型
public static <E> void shuffle(List<E> list);
public static void shuffle(List<?> list) {
  shuffleWithCapture(list);
}

private static <E> void shuffleWithCapture(List<E> list) {
  // implementation
}
public static <T extends Foo & Bar> void foo(T);
public static <E extends Foo & Bar> void foo(List<E>);
public static <T extends Comparable<? super T>> void sort(List<T> list);