4

我有以下情况:

public class A {
}

public class B extends A {
}

public class C extends B {
    public void Foo();
}

我有一个可以返回类ABC的方法,并且我想安全地转换为 C ,但前提是类类型为C。这是因为我需要调用 Foo() 但我不想要 ClassCastException。

4

4 回答 4

7

你能做这个吗?

if (obj instanceof C) {
   ((C)obj).Foo();
}
else {
   // Recover somehow...
}

但是,请参阅此问题中的其他一些评论,因为过度使用instanceof有时(并非总是)表明您需要重新考虑您的设计。

于 2010-07-24T13:32:25.503 回答
3

您可以在使用 instanceof 进行强制转换之前检查类型

Object obj = getAB_Or_C();

if ( obj instanceof C ) {
  C c = (C) obj;
}
于 2010-07-24T13:32:32.260 回答
2

你应该做的是类似下面的事情,那么你就不需要投射了。

public class A { 
    public void foo() {
        // default behaviour.
    }
} 

public class B extends A { 
} 

public class C extends B { 
    public void foo() {
       // implementation for C.
    }
} 
于 2010-07-24T13:40:16.100 回答
2

作为 的替代方案instanceof,考虑

interface Fooable { void foo(); }

class A implements Fooable { ... }
于 2010-07-24T13:41:01.623 回答