未经检查的强制转换与不可转换的类型

时间:2017-01-19 20:27:48

标签: java

我发现一些旧代码中的错误显然永远不会有效。但是,它是运行时异常而不是编译时异常。我将自定义类替换为标准Java类,并且出现编译错误。

导致一个是未经检查的强制转换(运行时异常)而另一个是不可转换类型(编译异常)的区别是什么?

GenTest.java

import java.util.Collection;
import java.util.Optional;

public class GenTest {
    public static void main(String[] args) {
        try {
            MyClass<Integer> a = new MyClass<>(10);
            // This generates a warning but compiles, then fails at runtime
            Collection<MyClass<Integer>> runtimeFail = (Collection<MyClass<Integer>>) a;
        } catch (ClassCastException cce) {
            cce.printStackTrace();
            System.out.println("encountered expected runtime error");
        }

        Optional<Integer> b = Optional.of(10);
        // This generates a compile time exception
        //Collection<Optional<Integer>> compileFail = (Collection<Optional<Integer>>) b;
    }
}

MyClass.java

public class MyClass<T> {
    T value;

    public MyClass(T value) {
        this.value = value;
    }
}

1 个答案:

答案 0 :(得分:0)

汤姆把我指向回复问题的副本,见ClassCastException vs. "cannot cast" compilation error

要重新哈希,我将MyClass更改为final,这给出了编译时错误。可选也是最后一堂课。

由于