我很困惑,如果下面的方法是相同的?有什么细微的区别吗?
非常感谢你的建议。
方法1
public static double sumOfList(List<?> list) {}
方法二
public static <T> double sumOfList(List<T> list) {}
在第二种方法中,你可以这样使用:
T t;
然而,在第一种方法中你不能。我认为这就是区别。我希望它能帮助你。
在这种情况下,没有区别。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[]);
你不能用通配符。
在方法内部,您可以在第二种情况下使用T
。
在第一种情况下你不能。
考虑这个例子
private static <T> void printList(List<T> list) {
for (T t: list) {
System.out.println(t);
}
}
问题内容: 该问题的答案表明,当方法采用通配符通用类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特) 这是什么意思?“ 当方法采用通配符通用类型时,可以访问或修改集合,但不能同时访问两者 ”? 据我所知,方法do1具有d2只能访问但不能修改。d2的方法使c2可以被访问和修改,并且没有编译错误。 通用准则 问题答案: 该问题的答案表明,当方法采用通配符通用类型时,可以访问或修改集合
问题内容: 与完全跳过它们相比,在类中使用通配符类型的泛型有什么优势吗? 问题答案: 有很多优点。 他们不会像使用原始类型那样产生编译器警告 它们提供了更多的类型安全性。例如,考虑是否是。如果您使用代替,则可以执行以下操作: 即使该列表仅 应 包含s。如果返回,则您将无法添加 任何 内容(除外),因为列表类型未知。 他们记录的东西与原始类型完全不同,即使用某种 未知但特定的类型进行输入 。
这个问题的答案表明,当方法采用通配符泛型类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特) 据我所知,方法do1有,因此d2只能被访问,不能被修改。方法d2具有,因此可以访问和修改c2,并且没有编译错误。 通用指南
这2个功能有什么区别? 我看到了相同的输出。
我是java新手,我在网上读了很多关于还是,但我还是不明白。下面是我的例子: 为什么会有错误?我的问题和评论中提到的不同
方法在类型不适用于参数