我不明白这两个代码片段之间的区别。
第一个例子中T extends List
的作用是什么?我可以将其解释为“名为see
的方法,您可以将List
的{{1}}类型或子类型传递给”吗?如果是,为什么不使用方法2?
1
List
2
public <T extends List> void see(T n) {}
答案 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;可能更常见。