为什么`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()
,但它们很少。)