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

用户名

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

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);
    }

}

我以为getList1()正在返回List从扩展的类的a ObjectString是其中之一吗?

不,这不是一个重复的问题(至少不是重复的问题)。如果我确实定义了对象列表,那么我当然不希望它采用字符串列表。但是在这里,我接受对象列表以及从对象扩展的对象列表,所以问题是为什么它在第一种情况下不接受String。

JDC

您可以这样调用方法:

myClass.<String>getList1().add(String.class);

编译器需要以某种方式知道您T应该是什么<String>称为类型见证)。


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章