当前位置: 首页 > 知识库问答 >
问题:

列表

蒋高杰
2023-03-14

分配列表

分配列表

代码

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) {

    }
}

问题

为什么没有列出

还有,你知道我在哪里可以找到这样的东西吗?

一个相关的问题是泛型地狱:Hamcrest匹配器作为方法参数。但是我不认为那里的答案有帮助。

编辑

在我最终得到JB Nizet的答案之前,我不得不考虑了几个小时。所以我在这里稍微扩展一下。也许这会帮助别人。

假设分配一个List

// 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指出的,这是泛型协方差,与列表相同


共有3个答案

靳金鹏
2023-03-14

好的,上面问的问题是不同的。。。我们可以这样理解这个问题:

List<? super String> a = new ArrayList<Object>();
List<List<? super String>> b = new ArrayList<List<Object>>();

List<List<? super String>> c = new ArrayList<List<? super String>>();

在此代码中,第2行不是编译。。。。那么,为什么不进行编译呢?

答复:

列表

但是我们分配的对象说ListArrayList,它可以接受任何类和每个类。

所以这两个列表是不同的,java在编译时显示了这一点。

齐修贤
2023-03-14

您必须将方法TakeListofListOverstring更改为

static void takeListOfListSuperString(List<? extends List<? super String>> ListOfListSuperString)

其原因是协方差。内部类型List

弘康安
2023-03-14

因为一个List

假设?超级字符串字符序列。您是否认为以下编译是正常的?

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?

 类似资料:
  • 问题内容: 我想知道从ArrayList转换为Array是否安全/建议?我有一个文本文件,每行一个字符串: 我想将它们读入数组列表,然后将其转换为数组。建议这样做/合法吗? 谢谢 问题答案: 是的,将转换为是安全的。一个好主意取决于您的预期用途。您需要提供的操作吗?如果是这样,请将其保留为。否则转换掉! 输出

  • 问题内容: 我有一个列表列表: 我想将其平均 我的代码好像不太优雅。这是遍历列表的幼稚方法,将总和保存在单独的容器中,然后除以元素数。 我认为有一种Python方式可以做到这一点。有什么建议?谢谢 问题答案: 纯Python: 印刷 NumPy: Python 3:

  • 问题内容: 我在Web API项目中使用了Dictionary,该项目的序列化方式类似于JSON: 因为我有重复的键,所以我不能再使用Dictionary类型,而现在我正在使用 但这是以这种方式序列化的: 有没有办法像字典一样进行序列化? 谢谢。 问题答案: 如果您使用Newtonsoft Json.NET库,则可以执行以下操作。 定义一个转换器,以所需的方式写入键/值对的列表: 然后使用转换器:

  • 我认为我发现了一个错误在运行时的Java与JSF 2.0(使用Primeface),在这个项目中我使用JSF 2.0 Primeface和CDI。 恢复问题,我的业务类Role中有一个方法设置器收到了一个List,但JSF正在设置一个ArrayList。java应该抛出异常还是至少不应该找到匹配的方法?这里是: 该方法的输出为: 当我尝试在foreach中使用这样的: 投掷 你能解释一下这是怎么回

  • 我的DTO中有一个字符串列表,我想把它映射成一个对象列表,在映射器中我使用服务通过这个字符串获取对象,但我有以下错误 考虑声明/实现一个映射方法:“java.util.list map(java.util.list value)”。

  • 我有一个字符串数组列表,内容如下: 我只需要输出从ID到下一个ID。 例如: 如何在不指定确切位置的情况下访问它。我想到了,直到下一个,我只是不知道如何实现它。 非常感谢你的帮助

  • 我使用的是mapstruct 1.4.2.final。我有一个这样的问题: Business1 id有许多Business2 id关系。我想像RelationDTO一样使用DTO来记录。 谢谢你的留言。

  • 问题内容: 伙计们 我正在尝试找到问题的最优雅解决方案,并且想知道python是否为我想做的事情内置了任何东西。 我正在做的是这个。我有一个列表,并且我有一个接受项目并返回列表的函数。我可以使用列表推导来转换所有内容,例如: 但这返回一个列表列表; 我真正想要的是获取扁平化的列表; 现在,其他语言也有它。传统上用函数式编程语言来称呼它,而.Net称它为。python有类似的东西吗?有没有一种巧妙的