当类被设为通用时,为什么“不兼容类型”编译错误会变成警告?

2024-01-09

我有这段代码,无法编译:

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(使用前将#替换为@)

当类被设为通用时,为什么“不兼容类型”编译错误会变成警告? 的相关文章

随机推荐