为什么这个演员没有生成编译器警告?

时间:2012-01-26 20:21:24

标签: java casting compiler-warnings runtime-error

为什么以下java代码没有生成编译器警告,说“从SuperClass到SomeBaseClass的不安全强制转换”?

public abstract SuperClass
{
    static SuperClass create()
    {
        return new AnotherBaseClass();
    }

    private static class SomeBaseClass extends SuperClass
    {
        void print()
        {
            System.out.println("Hello World");
        }
    }

    private static class AnotherBaseClass extends SuperClass
    {
    }

    public static void main(String[] args)
    {
        SomeBaseClass actuallyAnotherClass = (SomeBaseClass)SuperClass.create();
        actuallyAnotherClass.print();
    }
}

我在Windows机器上使用了jdk1.6.0_25 / bin / javac。 Eclipse Helios也没有对此发出警告。

相反,它会导致运行时异常:

  

线程“main”中的异常java.lang.ClassCastException:SuperClass $ AnotherBaseClass无法强制转换为SuperClass $ SomeBaseClass

3 个答案:

答案 0 :(得分:8)

Javac仅在使用泛型时警告不安全的强制转换。在这里编译器相信你知道你在做什么:)

答案 1 :(得分:3)

实际上,如果根本不可能进行转换,编译器会抛出错误,例如如果create()方法返回类型为AnotherBaseClass而不是SuperClass

由于它返回SuperClass,编译器不知道实际返回什么 - 它也可以返回SomeBaseClass。因此,它必须相信你知道你对该演员的所作所为。

修改

要在投射时收到警告,您可以尝试使用像Checkstyle这样的代码分析工具。 但请注意,这些工具很可能不能或不能检查类层次结构,因此可能只能警告通常使用的(非原始)强制转换。因此,如果您使用需要强制转换的库(例如,如果您正在使用不支持泛型的apache commons集合),则会收到 lot 警告。

毕竟,编程仍然是 art ,你仍然需要知道你在做什么。

答案 2 :(得分:0)

这不是编译器警告。在尝试将AnotherBaseClass对象转换为SomeBaseClass时,它在运行时失败。