Как я могу сделать безопасный downcast и предотвратить ClassCastException - PullRequest
4 голосов
/ 24 июля 2010

У меня есть следующий сценарий:

public class A {
}

public class B extends A {
}

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

У меня есть метод, который может вернуть класс A , B или C , и я хочу безопасно привести его к C, но только если тип класса C . Это потому, что мне нужно вызвать Foo (), но я не хочу ClassCastException.

Ответы [ 4 ]

7 голосов
/ 24 июля 2010

Можете ли вы сделать это?

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

Однако, пожалуйста, посмотрите некоторые другие комментарии в этом вопросе, так как чрезмерное использование instanceof иногда (не всегда) признак того, что вам нужнопереосмыслить свой дизайн.

3 голосов
/ 24 июля 2010

Вы можете проверить тип перед использованием, используя instanceof

Object obj = getAB_Or_C();

if ( obj instanceof C ) {
  C c = (C) obj;
}
2 голосов
/ 24 июля 2010

В качестве альтернативы instanceof рассмотрим

interface Fooable { void foo(); }

class A implements Fooable { ... }
2 голосов
/ 24 июля 2010

Что вы должны сделать, это что-то вроде следующего, тогда вам не нужно разыгрывать.

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

public class B extends A { 
} 

public class C extends B { 
    public void foo() {
       // implementation for C.
    }
} 
...