为什么`test2()`方法编译成功,而`test1()`没有';T 请考虑下面的测试>代码> java类。< /P>
为什么为什么`test2()`方法编译成功,而`test1()`没有';T 请考虑下面的测试>代码> java类。< /P>,java,generics,Java,Generics,为什么test2()方法编译成功,而test1()编译失败 import java.util.Arrays; import java.util.List; public class Test { public <N extends Number> List<N> test1(){ //compile error: Type mismatch: cannot convert from List<Integer> to List<
test2()
方法编译成功,而test1()编译失败
import java.util.Arrays;
import java.util.List;
public class Test {
public <N extends Number> List<N> test1(){
//compile error: Type mismatch: cannot convert from List<Integer> to List<N>
return Arrays.asList(1,2,3);
}
public List<? extends Number> test2(){
//no compile error
return Arrays.asList(1,2,3);
}
}
导入java.util.array;
导入java.util.List;
公开课考试{
公共列表test1(){
//编译错误:类型不匹配:无法从列表转换为列表
返回数组.asList(1,2,3);
}
public List如果编写调用这些方法的代码,它将变得更加清晰
例如:
public static void main (String args) {
Test obj = new Test();
List<Double> list1 = obj.test1 ();
List<? extends Number> list2 = obj.test2 ();
}
publicstaticvoidmain(字符串参数){
测试对象=新测试();
List list1=obj.test1();
列表
,并且一个列表
可以分配给所有三个。有帮助吗?顺便说一句:N
是一个类型参数,只存在于输出中。因此,调用者基本上可以根据上下文确定它的类型。这通常是一个糟糕的设计:既然调用者可以将N
设置为它想要的任何类型,那么怎么不能呢函数返回正确的类型?(在某些特定情况下,这是正确的,例如Collections.emptyList()
,但它们很少。)