2015-05-29 545 views
1

嗨,我正在学习卡普兰selftest问题和答案。我真的坚持一个关于Unchecked转换警告的解释。它指出未经检查的转换警告vs通用类型的参考

下面的语句将不会产生未检查转换警告:

ArrayList list = new ArrayList<>();

但在接下来的一段,它指出

下面的语句将产生选中警告:

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

我在eclipse检查它提供了以下警告味精

的ArrayList是一个原始类型。参考通用类型ArrayList应参数化

有人可以帮助我吗?这只是一个错字错误,或者我错过了一些东西。 在此先感谢。

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

+1

除了第二条语句中的尾注释之外,两条语句完全相同。所以难怪他们都会产生相同的行为,在这种情况下,会有警告 –

+0

两者都会产生相同的行为,但我对解释感到困惑。在第一个声明中,它声明它不会生成未经检查的转换警告,但在接下来的声明中它声明它将生成未经检查的警告。所以我很困惑哪一个应该是正确的答案,尽管Eclipse生成“参考通用...”警告而不是转换警告。我真的需要理解它来回答考试问题。 –

回答

3

第一:这是一个警告,如果你小心,你可以忽略它,你的代码仍然会编译和运行就好。

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

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

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

+1

在Java 7之前的代码中,这看起来像这样:'ArrayList list = new ArrayList ()',如果这可以帮助你更多的OP。 – Oli

+0

我知道如何摆脱那个警告。我试图理解它来回答考试问题。例如ArrayList list = new ArrayList <>(); “生成转换警告”true/false ?.我对ArrayList list = new ArrayList <>();在解释中声明它不会产生转换警告,然后在下一个声明中说明它会产生转换警告,因此我有点失落。 –

+0

只是想[添加此答案我发现如此有用](http://stackoverflow.com/a/27720466/1614677) – Manu

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<>(); 
0

你说的是泛型类型。

在Java 1.6,你可以使用构造与仿制药如下

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

在java中1.7,你可以使用构造与仿制药如下

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

前面的语句创建拥有一个ArrayList字符串。一种指示ArrayList等数据结构的对象类型的方法。

如果您使用的ArrayList使用旧版本的Java,你会写这样的构造:

ArrayList list = new ArrayList(); 

有没有办法限制的类型。所以泛型被引入。

尽管您仍然可以这样做,但泛型使您的代码更可靠 ,因为它们为编译器提供了一种防止误用ArrayList的方法。 如果你试图把一个Integer对象放在一个ArrayList中,它应该保存String对象,编译器会失败并报错。

认为这将有所帮助。

相关问题