我有以下情形:我怎樣才能做到安全垂頭喪氣,防止一個ClassCastException
public class A {
}
public class B extends A {
}
public class C extends B {
public void Foo();
}
我有可以返回類的方法的,乙或Ç,我想只有在類別類型爲C時,才能安全地投射到C上。這是因爲我需要調用Foo(),但我不想要ClassCastException。
我有以下情形:我怎樣才能做到安全垂頭喪氣,防止一個ClassCastException
public class A {
}
public class B extends A {
}
public class C extends B {
public void Foo();
}
我有可以返回類的方法的,乙或Ç,我想只有在類別類型爲C時,才能安全地投射到C上。這是因爲我需要調用Foo(),但我不想要ClassCastException。
你可以這樣做嗎?
if (obj instanceof C) {
((C)obj).Foo();
}
else {
// Recover somehow...
}
但是,請看到一些其他意見在這個問題上,因爲過度使用的instanceof
有時(並不總是),你需要重新考慮你的設計的標誌。
謝謝,我會考慮改變我的設計。這只是它增加了許多樣板,總是使用C型。 – 2010-07-24 14:11:06
instanceof就像goto,如果你使用它,那麼你需要花時間並重構你的源碼:) – vach 2014-12-24 14:18:28
可以使用的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.
}
}
SOmetimes,有時不是。 A沒有任何方法使用foo()方法,並且您可能無法更改類A. – 2010-07-24 13:42:16
我無法更改類A - 它是GWT UI包的一部分。 – 2010-07-24 14:13:06
下次將這些信息添加到您的問題。 – 2010-07-24 14:38:52
作爲替代instanceof
,考慮
interface Fooable { void foo(); }
class A implements Fooable { ... }
在你走之前全油門到使用'instanceof',看看這樣的職位,如使用'instanceof'往往是一個跡象設計缺陷:http://stackoverflow.com/questions/2750714/is-instanceof-considered-bad-practice-if-so-under-what-circumstances-is-instanc和http://stackoverflow.com/questions/ 2790144/avoid-instanceof-in-java – Abel 2010-07-24 13:36:21
考慮使用和接口,這樣你就可以擺脫java的單一繼承模型給你帶來的所有細微差別和限制。 public interface IFoo {public void foo();} – 2010-07-24 14:28:05