泛型和收藏,不明白

时间:2017-06-14 13:19:49

标签: java generics collections

这3行之间有什么区别吗?

List list2 = new ArrayList<String>();
List  list2 = new ArrayList<>();
List  list2 = new ArrayList();

据我所知,有关泛型的所有信息都会在运行时被删除。因此,只有可靠的类型才是重要的。所以上面的代码对我来说意味着同样的事情。如果我错了可以有人给我一些显示差异的例子吗?  附:对不起我的英文

1 个答案:

答案 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)在一个单独的类中,在第一百行,我知道 行是有问题的一行。但是,我不知道添加非字符串对象的位置,只知道它被访问的位置。

如果您使用泛型类型,则可以确切地知道添加有问题的位置,并且可以阻止它。