java unbound wildcard <! - ? - > vs <t> </t>

时间:2013-09-13 13:20:30

标签: java generics

如果以下方法相同,我会感到困惑吗?有什么微妙的差异吗?

非常感谢您的建议。

方法1

public static double sumOfList(List<?> list) {}

方法2

public static <T> double sumOfList(List<T> list) {}

3 个答案:

答案 0 :(得分:8)

在方法中,您可以在第二种情况下使用T

你不能在第一种情况下。

考虑这个例子

private static <T> void printList(List<T> list) {
for (T t: list) {
    System.out.println(t);
}

}

答案 1 :(得分:1)

在这种情况下,没有区别。 T仅在参数的一个位置使用,因此它不会强制两个地方的类型之间的关系。

在其他情况下,例如如果T在返回类型中:

public <T> List<T> newList();

或在多个地方使用T

public <T> T foo(T x);

public <T> void bar(List<T> list, T x);

T是递归限制的:

public <T extends Comparable<? super T>> void sort(T[]);

你不能用通配符来做。

答案 2 :(得分:0)

在第二种方法中你可以这样使用:

T t;

然而你不能在第一种方法中。 我认为这是不同的。 我希望它会对你有所帮助。