Java Generic方法 - extends关键字的用法是什么?

时间:2013-09-12 13:03:48

标签: java generics

我不明白这两个代码片段之间的区别。

第一个例子中T extends List的作用是什么?我可以将其解释为“名为see的方法,您可以将List的{​​{1}}类型或子类型传递给”吗?如果是,为什么不使用方法2?

1

List

2

public <T extends List> void see(T n) {}

2 个答案:

答案 0 :(得分:3)

在这个例子中,我认为它没用。

但在这一个:

public <T extends MyClass> T[] toArray(List<T> n) {
   ...
}

它为您提供了一些类型检查(我在返回类型中重用了T)。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
//I gave a List<Integer> so it returns a Integer[]. No need to cast ! 
Integer[] myArray = toArray(list);

在这种情况下:

//I don't know the generic type of the list so I return a Object[]
public Object[] toArray(List n) {
   ...
}

您需要投射结果。

注意:要回答您的问题,<T extends MyClass>只会将T的类型限制为MyClass的子类。

答案 1 :(得分:1)

&#34;有界通用类型&#34;通常用于允许类中的方法/或方法的参数类型或返回类型相互关联。

考虑你的例子1):

public <T extends List> void see(T n) {}

泛型类型被限制为List的子类型,因此在JVM级别上编译(原始)代码&amp;签名将等同于示例2)。

在&#34; generic&#34;中有一些微妙的语义差异。 &#34; raw&#34;但是,编译器会处理类型。 &#34; raw&#34;之间的转换和&#34;泛型&#34;类型通常是警告,与未经检查的泛型类型操作一样。

对于使用泛型的代码,声明List(我理解)会更好。由于方法参数之间没有相互关系,第二种风格会更简单。

我的建议:

public void see (List<?> items) {}

1)中的样式对于相互关联的参数/或结果类型更有意义。几个单独的示例,显示了更典型的用法:

public <T>  List<T> getChildren (T parent);
public <T>  List<T> listItems (T list1, T item2);
public <T extends List<?>>  T combineLists (T list1, T list2);

将T声明为项参数并对其进行泛化,而不是将T声明为&#34;集合类型&#34;可能更常见。