我正在阅读泛型并尝试编写以下代码。没有编译错误。
import java.util.*;
public class JavaApplication14 {
public<T> void run (T obj ) {
//Do Something
}
public static void main(String[] args) {
JavaApplication14 m= new JavaApplication14();
m.run(new ArrayList<>());
m.run(new Interger(5);
m.run(5);
}
}
如果功能是
public<T extends Number> void run (T obj) {
//Do Something
}
这很有意义,因为我们可以将此函数的参数限制为Number及其子类型。但是,让函数“运行”是什么却没有任何束缚的意思却感到非常困惑?现在可以将任何对象作为参数了吗?在什么情况下我需要对泛型使用此类功能?
您可能会感到困惑的部分原因是,run
在这种情况下使用通用方法毫无意义。通常,您可以使用类型参数来创建两个参数类型之间和/或参数类型与返回类型之间的关系。在您的示例中,run
也可能已被声明为需要Object
参数(没有声明边界的类型参数实际上具有Object
其边界)。
我知道有一种情况,您可能会在单个参数类型中有用地使用类型参数:当您希望能够以一种不依赖元素类型的方式来操作集合,但确实需要插入元素时进入收藏。考虑一个假设的“反向列表”方法:
<T> void reverse(List<T> list)
{
List<T> reversed = new ArrayList<T>();
for (int i = list.size(); i > 0; i--) {
reversed.add(list.get(i - 1));
}
list.clear();
list.addAll(reversed);
}
以不需要类型参数的方式(即采用List<?>
参数)来编写此代码将很困难。没有强制转换的唯一方法是:
void reverse2(List<?> list)
{
reverse(list); // call reverse as defined above!
}
但是同样,这不适用于您讨论的示例。
因此,总而言之:
没有显式边界的类型参数有效地具有Object
边界。
方法可能需要类型参数(有或没有显式绑定)的原因有两个:
reverse
示例中所示)。您讨论的示例方法:
public<T> void run (T obj )
...都不做,所以type参数毫无意义。该方法可能也已经声明为public void run(Object obj)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句