我有以下情况:
public class A {
}
public class B extends A {
}
public class C extends B {
public void Foo();
}
我有一个可以返回类A、B或C的方法,并且我想安全地转换为 C ,但前提是类类型为C。这是因为我需要调用 Foo() 但我不想要 ClassCastException。
你能做这个吗?
if (obj instanceof C) {
((C)obj).Foo();
}
else {
// Recover somehow...
}
但是,请参阅此问题中的其他一些评论,因为过度使用instanceof
有时(并非总是)表明您需要重新考虑您的设计。
您可以在使用 instanceof 进行强制转换之前检查类型
Object obj = getAB_Or_C();
if ( obj instanceof C ) {
C c = (C) obj;
}
你应该做的是类似下面的事情,那么你就不需要投射了。
public class A {
public void foo() {
// default behaviour.
}
}
public class B extends A {
}
public class C extends B {
public void foo() {
// implementation for C.
}
}
作为 的替代方案instanceof
,考虑
interface Fooable { void foo(); }
class A implements Fooable { ... }