当我尝试使用通配符将参数设置为扩展数时,如下面的代码所示 -
import java.util.*;
class Try {
public static void main(String [] args) {
List <Integer>a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
System.out.println(foo(a));
}
public static double foo(List<? extends Number> list) {
double x = 0.0;
for (Object e : list)
x += (Integer) e;
return x;
}
}
编译好。 但是,如果我使用泛型类型,如此处所示 -
import java.util.*;
class Try {
public static void main(String [] args) {
List <Integer>a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
System.out.println(foo(a));
}
public static <T extends Number> double foo(List<T extends Number> list) {
double x = 0.0;
for (Object e : list)
x += (Integer) e;
return x;
}
}
我收到以下语法错误 -
Try.java:12: error: > expected
public static <T extends Number> double foo(List<T extends Number> list) {
^
Try.java:12: error: ')' expected
public static <T extends Number> double foo(List<T extends Number> list) {
^
Try.java:12: error: ';' expected
public static <T extends Number> double foo(List<T extends Number> list) {
^
Try.java:12: error: <identifier> expected
public static <T extends Number> double foo(List<T extends Number> list) {
^
4 errors
为什么第二种情况会给我一个错误?在这种情况下,泛型和通配符有什么区别?
答案 0 :(得分:1)
你写的是无效的语法。这就是你的意图:
public static <T extends Number> double foo(List<T> list) {
也就是说,extends
属于类型标记定义,而不属于方法参数列表中的类型声明。
答案 1 :(得分:0)
假设在你的第二段代码中你的意思是:
use
两个声明之间没有区别。可以传递给一个函数签名的任何类型都可以传递给另一个,反之亦然。其中use CPAN
是public static <T extends Number> double foo(List<T> list)
的非严格子类型的每种可能类型List<T>
都是T
的子类型。并且Number
可以List<? extends Number>
与List<? extends Number>
一起被捕获。所以两者完全等价。