首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List vs List<Object>?

List vs List<Object>?
EN

Stack Overflow用户
提问于 2014-02-20 23:14:33
回答 5查看 345关注 0票数 3

请解释一下List - raw类型和List<Object>的区别。

下面的代码给出了运行时错误:

代码语言:javascript
复制
public static void main(String[] args) {
    List<String> strings = new ArrayList<String>();
    unsafeAdd(strings, new Integer(42));
    String s = strings.get(0); // Compiler-generated cast
}
private static void unsafeAdd(List list, Object o) {
    list.add(o);
}

这给出了编译时错误:

代码语言:javascript
复制
public static void main(String[] args) {
    List<String> strings = new ArrayList<String>();
    unsafeAdd(strings, new Integer(42));
    String s = strings.get(0); // Compiler-generated cast
}
private static void unsafeAdd(List<Object> list, Object o) {
    list.add(o);
}
EN

回答 5

Stack Overflow用户

发布于 2014-02-20 23:16:03

在第二种情况下,你正在做一些编译器可以解决的不安全的事情。在第一种情况下,您使用的是原始类型,因此编译器不会执行相同的检查。

票数 7
EN

Stack Overflow用户

发布于 2014-02-20 23:20:10

Java没有对参数类型的继承。因此,List<Integer>不是List<Object>的子类,因此不能使用List<Integer>List<String>作为unsafeAdd方法的参数。但是你可以这样写:

代码语言:javascript
复制
private static <T> void unsafeAdd(List<T> list, T o) {
     list.add(o);
}

安全地叫它:

代码语言:javascript
复制
List<String> strings = ...
unsafeAdd(string, "42");

并在执行以下操作时出错:

代码语言:javascript
复制
List<String> strings = ...
unsafeAdd(strings, 42); // error!

您可以在Oracle Generics Tutorial, Generics, Inheritance, and Subtypes中查看更多信息

票数 2
EN

Stack Overflow用户

发布于 2014-02-20 23:20:14

在第一种情况下,您将非参数化列表传递给unsafeAdd,因此编译器无法发现错误。

向期望List的方法传递List<String>是可以的。将对象添加到List是可以的。

在第二种情况下,你将List<String>传递给需要List<Object>的方法--这是不对的。因为以这种方式,您隐含地允许将非字符串添加到List<String> -编译器可以在这种情况下找出它并引发错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21911871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档