java - List<String> 无法转换为 List<?>

标签 java generics

<分区>

我有一个生成器类,它的方法接受未知类型的列表

public class A{
    private List<D<?>> data;
    public void setData(List<D<?>> data){
        this.data=data;
    }
}
public class D<T>{
        private List<T> data;
        public void setData(List<T> data){
            this.data=data;
        }
    }

然后在我的调用类中我有:

    public class B{
        private A a;

        public void apply(A a, List<D<String>> list){
            a.setData(list); //It shows an error
        }
    }

出现以下错误:

List<String> cannot be converted to List<?>

我对未知类型的理解是它应该允许像这样基本的东西。它们都是 java.util.List

谁能解释为什么会这样以及解决方法是什么?

最佳答案

解释:

如果我们有,

public void apply(A a, List<D<String>> list){
    a.setData(list); //It shows an error
}

它总是限制那种类型的 D实例应始终为 String s 在 apply() 的上下文中.因为我们实际拥有的是 a类的实例 A可能是 List<D<Integer>> .编译器看到这个冲突,它不允许编译。

修复:

public void apply(A a, List<D<?>> list){
    a.setData(list);
}

因为您可以自由地为 T 设置任何类型在类里面D . 无界类型参数。

因此,您可以实例化 D实例如下:

D<Integer> intD = new D<Integer>();
D<String> stringD = new D<String>();

根据 D 的类声明,所有这些都是完全可以接受的(因为无界类型参数)

如果我们取 stringD例如,它有一个 ListString秒。 与intD相同例如,它有一个 ListInteger

关于java - List<String> 无法转换为 List<?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37466389/

相关文章:

java - 如何在Java Spring Boot中读取Resources中保存的文件

java - 如何更高效地注释多个Stanford CoreNLP CoreDocuments?

generics - 用下划线实例化 Rust 泛型是什么意思?

c# - 使用泛型的扩展方法

java - 构建泛型类

java - 无法加载类 'com.google.gson.JsonObject'

java - @RequestMapping 多个页面

java - 为什么在android中命名资源不能使用大写?

c# - 使用泛型和多态性,得到错误

java - 如何访问通用对象的类型?