gpt4 book ai didi

java - 列表<列表 没有按预期工作

转载 作者:行者123 更新时间:2023-11-29 09:49:11 29 4
gpt4 key购买 nike

分配 List<Object>List<? super String>工作正常。

分配 List<List<Object>>List<List<? super String>>不编译。

代码

public class Main {
public static void main(String[] args) {
// works fine
List<Object> listOfObject = new ArrayList<>();
takeListSuperString(listOfObject);

// doesn't compile
List<List<String>> listOfListOfObject = new ArrayList<>();
takeListOfListSuperString(listOfListOfObject);
}

static void takeListSuperString(List<? super String> listSuperString) {

}

static void takeListOfListSuperString(List<List<? super String>> listOfListSuperString) {

}
}

问题

为什么不 List<List<? super String>>工作方式与 List<? super String> 相同?

另外,知道在哪里可以查找此类内容吗?

一个相关的问题是Generics hell: hamcrest matcher as a method parameter .但我觉得那里的答案没有帮助。

编辑

我必须仔细考虑JB Nizet's answer在我终于得到它之前几个小时。所以我会在这里稍微扩展一下。也许这会对其他人有所帮助。

假设分配一个 List<List<CharSequence>>List<List<? super String>>是可能的,下面的代码将编译:

// can only contain instances of CharSequence
List<List<CharSequence>> listOfListOfCharSequences = new ArrayList<>();

List<List<? super String>> listOfListSuperString = listOfListOfCharSequences;

// add a list of objects containing an Integer
List<Object> listOfObjects = new ArrayList<>();
listOfObjects.add(123);
listOfListSuperString.add(listOfObjects);

// Ups.. exception at runtime we are getting an Integer where we expect a CharSequence
CharSequence charSequence = listOfListOfCharSequences.get(0).get(0);

所以为了防止在运行时出现丑陋的异常,这是不允许的。

作为halex points out这是泛型协方差,与 List<String> 相同不可分配给 List<Object> .并使用 List<? extends List<? super String>>代码实际上会编译,因为 ? extends String防止 List.add()打电话。

最佳答案

因为 List<Object>List<? super String> 不同. List<? super String>持有一种您不知道的特定类型的对象,但它是 String 或 String 的父类(super class)或超接口(interface)。而 List<Object>是一个可以容纳任何类型对象的列表。

假设 ? super StringCharSequence .您会发现以下编译正常吗?

List<List<Object>> listOfListOfObjects = new ArrayList<List<Object>>();
List<Object> listOfObjects = new ArrayList<Object>();
listOfObjects.add(new Integer());
listOfListOfObjects.add(listOfObjects);
List<List<CharSequence>> listOfListOfCharSequences = listOfListOfObjects; // WTF?

关于java - 列表<列表<? super String> 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13289847/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com