这3行之间有什么区别吗?
List list2 = new ArrayList<String>();
List list2 = new ArrayList<>();
List list2 = new ArrayList();
据我所知,有关泛型的所有信息都会在运行时被删除。因此,只有可靠的类型才是重要的。所以上面的代码对我来说意味着同样的事情。如果我错了可以有人给我一些显示差异的例子吗? 附:对不起我的英文
答案 0 :(得分:0)
虽然通用数据确实在编译时删除,但这并不意味着它们完全没用。 在您的示例中编译的唯一行是最后一行,但您会收到一条警告:您正在使用RawType
s。 RawType
是没有通用对象的泛型类。前两行只是半成品。
你几乎 使用泛型的原因是该列表是类型安全的。如果你使用泛型,你可以使用这样的东西:
List<String> list = new ArrayList<>();
String out = list.get(0);
如果您使用原始类型,则必须执行此操作:
List list = new ArrayList();
String out = (String) list.get(0);
这似乎没问题,但如果您add
列表的值不是String
,该怎么办?程序崩溃了。例如:
List unsafe = new ArrayList();
List<String> safe = new ArrayList<>();
unsafe.add("hi");
unsafe.add(new Tree());
safe.add("hi");
safe.add(new Tree()); // This line would throw an exception.
String out = (String) unsafe.get(0);
String out1 = safe.get(0);
String out2 = (String) unsafe.get(1); // This line would throw an exception.
如果你还没有完全明白为什么要使用泛型类型,那么原始类型的棺材中的最后一个钉子是这样的:如果我的(String) unsafe.get(1)
在一个单独的类中,在第一百行,我知道 行是有问题的一行。但是,我不知道添加非字符串对象的位置,只知道它被访问的位置。
如果您使用泛型类型,则可以确切地知道添加有问题的位置,并且可以阻止它。