3 回答
TA贡献1803条经验 获得超3个赞
这是可能的,因为 Java 中的类型擦除。简而言之,这意味着在运行时 Java 不知道您的泛型类型,因此任何List对象都使用Object类型进行操作。泛型具有编译类型安全性。但是您可以更详细地了解类型擦除,例如这里。
您可以自己模仿的相同行为:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
addToList(list);
System.out.println(list);
}
private static void addToList(List list) {
list.add(1L);
list.add(42);
list.add("String");
list.add(new Runnable() {
@Override
public void run() {}
});
}
只要您不尝试将列表条目作为字符串进行操作,此代码就可以正常工作。但是当你添加如下内容时:
for (String s : list) {
System.out.println(s);
}
你会得到java.lang.ClassCastException。
因此,在编译时,您可以使用List<String>,但在运行时,Java 只知道List.
TA贡献1794条经验 获得超8个赞
是的,你可以,这是一个小例子
public static void main(String args) {
List objects = new ArrayList();
objects.add("string");
objects.add(1L);
List<String> onlyStrings = objects;
}
如果您愿意,您可以将非通用列表转换为 List(您会收到一堆编译器警告)。
TA贡献1865条经验 获得超7个赞
考虑以下示例:
public static void main(String[] args) {
List a = new ArrayList();
a.add("a");
a.add(1L);
List<String> b = new ArrayList(a);
System.out.println(b);
}
这输出
[a, 1]
以上是合法的,因为java执行类型擦除,从而在运行时丢弃元素类型信息。这意味着每个 List 本质上都是一个 List 并且可以包含多个类实例。
public interface List<E> extends Collection<E>
转换为
public interface List extends Collection
在编译时。
如果 E 被绑定,即 E 扩展了 MyClass,它将被转换为 MyClass。
在您的情况下,您正在为每一行实例化一个地图,没有类型界限,您正在对其进行平面映射,然后将其收集到一个列表中,这实际上与我的示例相同,因此是合法的。
添加回答
举报