分配列表
分配
列表
代码
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指出的,这是泛型协方差,与
列表相同
好的,上面问的问题是不同的。。。我们可以这样理解这个问题:
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行不是编译。。。。那么,为什么不进行编译呢?
答复:
列表
但是我们分配的对象说
List
的ArrayList
,它可以接受任何类和每个类。
所以这两个列表是不同的,java在编译时显示了这一点。
您必须将方法TakeListofListOverstring
更改为
static void takeListOfListSuperString(List<? extends List<? super String>> ListOfListSuperString)
其原因是协方差。内部类型List
因为一个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有类似的东西吗?有没有一种巧妙的