我有这段代码,无法编译:
import java.util.ArrayList;
import java.util.List;
public class TypeSafetyTest {
public static void main(String[] args) {
TypeSafetyTest test = new TypeSafetyTest();
test.run();
}
private void run() {
Car car = new Car();
List<String> wheelWeights = car.getWheelWeights();
}
private class Car {
List<Double> wheelWeights = new ArrayList<Double>();
public List<Double> getWheelWeights() {
return wheelWeights;
}
public void setWheelWeights(List<Double> wheelWeights) {
this.wheelWeights = wheelWeights;
}
}
}
它给出了“不兼容类型”错误:
List<String> wheelWeights = car.getWheelWeights();
但是,如果我改变线路:
private class Car {
to
private class Car<T> {
然后代码编译成功,并在曾经出现编译错误的行上显示警告“未检查的分配”。为什么会这样呢?我期望它在这两种情况下都会给出编译错误。
我看到的一个问题是:
public List<Double> getWheelWeights() {
return wheelWeights;
}
returns Double
type List
,但您将其分配给List<String>
更改时没有看到编译错误的原因Car<T>
是的,因为您的实例创建是原始类型,这告诉编译器由于向后兼容性而在编译时忽略类型安全。
Car<Object> car = new Car<Object>();
如果您像这样更改对象,那么您将看到编译器再次抛出该消息。
请参考JLS 4.8 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8了解更多信息。
以下是 JLS 的示例:
class Outer<T>{
class Inner<S> {
S s;
}
}
Outer.Inner<Double> x = null; // illegal
不可能以部分原始类型(“稀有”类型)的形式访问 Inner,因为 Outer 本身是原始的,因此它的所有内部类(包括 Inner)也是原始的,因此不可能将任何类型参数传递给 Inner
仅允许使用原始类型作为对遗留代码兼容性的让步。强烈建议不要在 Java 编程语言中引入泛型之后编写的代码中使用原始类型。Java 编程语言的未来版本可能会禁止使用原始类型。
我建议阅读泛型(更新) http://docs.oracle.com/javase/tutorial/java/generics/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)