Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回带引用的列表泛型的Java方法声明_Java_List_Generics - Fatal编程技术网

返回带引用的列表泛型的Java方法声明

返回带引用的列表泛型的Java方法声明,java,list,generics,Java,List,Generics,你能解释一下为什么第一个不起作用吗 import java.util.ArrayList; import java.util.List; public class MyClass { private <T extends Object> List<Class<T>> getList1() { return new ArrayList<>(); } private <T extends Object

你能解释一下为什么第一个不起作用吗

import java.util.ArrayList;
import java.util.List;

public class MyClass {

    private <T extends Object> List<Class<T>> getList1() {
        return new ArrayList<>();
    }

    private <T extends Object> List<Class<T>> getList2(Class<T> cls) {
        List<Class<T>> list = new ArrayList<>();
        list.add(cls);
        return list;
    }

    private List<Class<? extends Object>> getList3() {
        return new ArrayList<>();
    }

    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        // 1. Not OK - The method add(Class<Object>) in the type List<Class<Object>> is not applicable for the arguments (Class<String>)
        myClass.getList1().add(String.class);
        // 2. OK
        myClass.getList2(String.class);
        // 3. OK
        myClass.getList3().add(String.class);
    }

}
import java.util.ArrayList;
导入java.util.List;
公共类MyClass{
私有列表getList1(){
返回新的ArrayList();
}
私有列表getList2(类cls){
列表=新的ArrayList();
列表。添加(cls);
退货清单;
}

private List您可以这样调用该方法:

myClass.<String>getList1().add(String.class);
myClass.getList1().add(String.class);
不知何故,编译器需要知道
T
应该是什么(
称为a)


  • 使用您的方法
    getList2(String.class)
    可以通过传入参数来指定它
  • 使用您的方法
    getList3()
    声明本身使用通配符(
    ),因此您不必指定
    T
    ,但您的列表将不是强类型的(它将接受扩展
    对象的每个类)

因为编译器无法推断
T
的类型,所以它默认为
对象
。可能的重复我不同意这是一个重复,因为我在问为什么
列表
不接受
列表
。哇,以前从未见过。这
来自什么?我想编译器可以从我上次的中分辨出来e> 添加(String.class)
?查看此处(特别是关于类型见证的部分):谢谢。我看了你建议的页面,但仍然不确定第一个方法为什么没有编译。特别是在页面的最底部,它说J8不再需要类型见证,在J8中,编译器可以从参数推断类型。因此
.add(String.class)
应该将
T
推断为
String
,因此在
getList1()
中使用相同的
T=String
,不是吗?我理解你的意思,老实说,我不知道确切的答案。出于个人兴趣,我发布了一个后续问题: