我正在学习Java泛型,我问自己这个问题。Java通用方法声明
这两个方法声明有什么区别?
public static void someMethod(List<? extends Number> numberList);
和
public static <E extends Number> void someMethod(List<E> numberList);
我正在学习Java泛型,我问自己这个问题。Java通用方法声明
这两个方法声明有什么区别?
public static void someMethod(List<? extends Number> numberList);
和
public static <E extends Number> void someMethod(List<E> numberList);
在后者你有someMethod
,即E
的范围内的类型的引用。在前者你不会。
使用第一个方法声明将不允许您向列表添加任何新内容。例如,这不会编译。
public static void someMethod(List<? extends Number> numberList, Number number) {
numberList.add(number);
}
而第二个可以让你做到这一点:
public <T extends Number> static void someMethod(List<T> numberList, T number) {
numberList.add(number);
}
有了你可以这样做的第二个版本:
public static <E extends Number> void someMethod(List<E> numberList) {
E number = numberList.get(0);
numberList.add(number);
}
这是不可能的第一个版本。
主要区别在于后者是通用方法前者不是。
因此,例如,在后一种方法,你可以做这样的事情:
public static <E extends MyObject> void someMethod(List<E> someList) {
E myObject = someList.iterator().next(); // this can actually lead to errors
myObject.doSomething(); // so treat it as an example
}
这意味着你可以替换它符合了一般方法声明规则的任意类型E
并能够使用该类型在你的方法中。
被告知,虽然你应该调用泛型方法与类型的参数是这样的:
someClass.<MyArbitraryType>someMethod(someList);
你可以找到的通用方法here一个很好的概述。
在java Se 7及以上版本中,你可以调用这个'someClass.somemethod(someList);''我相信,没有se7编译器atm,请确认吗? – ZeDonDino 2013-02-20 12:22:35
谢谢你指出。 – 2013-02-20 12:23:02
我没有se7编译器atm。 – 2013-02-20 12:23:50
使用第二个允许您在'someMethod's代码中引用E. – Oren 2013-02-20 12:01:49