为什么以下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
答案 0 :(得分:8)
Javac仅在使用泛型时警告不安全的强制转换。在这里编译器相信你知道你在做什么:)
答案 1 :(得分:3)
实际上,如果根本不可能进行转换,编译器会抛出错误,例如如果create()
方法返回类型为AnotherBaseClass
而不是SuperClass
。
由于它返回SuperClass
,编译器不知道实际返回什么 - 它也可以返回SomeBaseClass
。因此,它必须相信你知道你对该演员的所作所为。
修改:
要在投射时收到警告,您可以尝试使用像Checkstyle这样的代码分析工具。 但请注意,这些工具很可能不能或不能检查类层次结构,因此可能只能警告通常使用的(非原始)强制转换。因此,如果您使用需要强制转换的库(例如,如果您正在使用不支持泛型的apache commons集合),则会收到 lot 警告。
毕竟,编程仍然是 art ,你仍然需要知道你在做什么。
答案 2 :(得分:0)
这不是编译器警告。在尝试将AnotherBaseClass
对象转换为SomeBaseClass
时,它在运行时失败。