繁体   English   中英

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

[英]Java Generic method - what's the usage of extends keyword?

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

在第一个例子中, T extends List的作用是什么? 我可以把它解释为“一个命名的方法see ,你可以通过List型或亚型的List ,以”? 如果是,为什么不使用方法2?

1。

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

2。

public void see(List n) {}

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

但在这一个:

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):

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

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

然而,编译器如何处理“通用”和“原始”类型存在一些细微的语义差异。 “原始”和“通用”类型之间的转换通常是警告,未经检查的泛型类型操作也是如此。

对于使用泛型的代码,声明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声明为“集合类型”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM