未经检查的转换警告vs对泛型类型的引用

时间:2015-05-29 10:16:50

标签: java

您好我正在学习Kaplan自测题和答案。我真的被一个关于未经检查的转换警告的解释所困扰。它声明

  

以下语句不会生成未经检查的转换警告:

ArrayList list = new ArrayList<>();

但是在下一段中,它说明了

  

以下语句将生成未经检查的警告:

ArrayList list = new ArrayList<>(); //generates a conversion warning

我在日食中检查了它发出以下警告信息

  

ArrayList是原始类型。对泛型类型ArrayList的引用应该参数化

有人能帮助我吗?这只是一个错误的错误还是我错过了一些东西。 提前谢谢。

  

编辑   我想我没有正确解释我的问题。实际上我正在寻找的是“回答这样一个问题的正确答案是什么,例如ArrayList list = new ArrayList&lt;&gt;();生成未经检查的转换。真/假。”因为在Kaplan selftest中给出了两个不同的语句,我有点迷失,虽然当我在Eclipse中尝试代码时,它不会生成未经检查的转换警告,但它提供了泛型类型..警告的引用。所以我正在寻找你的建议/意见。再次提前感谢

3 个答案:

答案 0 :(得分:3)

对于一个:这是一个警告,如果你小心你可能会忽略它,你的代码仍然可以编译并运行得很好。

但是,既然你想摆脱它,你应该在定义它时给你的ArrayList类型。

ArrayList<Type> list = new ArrayList<>();

此类型可以是任何类,但不是基元。如果需要原语,请使用Java提供的包装类。

答案 1 :(得分:0)

JDK7:使用菱形运算符进行构造函数类型推断

ArrayList<Type> list = new ArrayList<>();

使用菱形算子可以简化创建对象时泛型的使用。它避免了程序中未经检查的警告,并且通过不要求显式重复指定参数类型来减少通用冗长。相反,编译器会推断出类型。

当类型不明显时使用菱形运算符:

只有在构造函数的参数类型明显的情况下,Java 7及更高版本才支持类型推断。例如,如果我们使用菱形运算符而没有为如下所示的标识符指定类型,我们将收到一系列警告:

List arrayList = new ArrayList<>();
arrayList.add("First");
arrayList.add("Second");

使用-Xlint编译程序:未选中,会产生以下警告:

... taman\diamond.java:29: warning: [unchecked] unchecked call to add(E) as a member of the
raw type ArrayList
arrayList.add("First");
where E is a type-variable:
E extends Object declared in class ArrayList
... \taman\diamond.java:30: warning: [unchecked] unchecked call to add(E) as a member of the raw type ArrayList arrayList.add("Second");
where E is a type-variable:
E extends Object declared in class ArrayList
2 warnings

如果数据类型指定如下,则这些警告将消失:

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

答案 2 :(得分:0)

你在谈论泛型类型。

在java 1.6中,您可以使用带有泛型的构造函数,如下所示

ArrayList<String> list = new ArrayList<String>();

在java 1.7中,您可以使用带有泛型的构造函数,如下所示

ArrayList<String> consumeLinks = new ArrayList<>();

前面的语句创建一个包含字符串的ArrayList。一种指示像ArrayList这样的数据结构的对象类型的方法。

如果您使用的是旧版Java的ArrayList,那么您可以编写如下构造函数:

ArrayList list = new ArrayList();

无法限制类型。所以引入了仿制药。

虽然您仍然可以执行此操作,但泛型使您的代码更可靠 因为它们为编译器提供了一种防止滥用ArrayList的方法。 如果您尝试将Integer对象放在应该的ArrayList中 保持String对象,编译器失败并显示错误。

认为这会有所帮助。