2010-07-24 62 views
4

我有以下情形:我怎樣才能做到安全垂頭喪氣,防止一個ClassCastException

public class A { 
} 

public class B extends A { 
} 

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

我有可以返回類的方法的Ç,我想只有在類別類型爲C時,才能安全地投射到C上。這是因爲我需要調用Foo(),但我不想要ClassCastException。

+5

在你走之前全油門到使用'instanceof',看看這樣的職位,如使用'instanceof'往往是一個跡象設計缺陷:http://stackoverflow.com/questions/2750714/is-instanceof-considered-bad-practice-if-so-under-what-c​​ircumstances-is-instanc和http://stackoverflow.com/questions/ 2790144/avoid-instanceof-in-java – Abel 2010-07-24 13:36:21

+0

考慮使用和接口,這樣你就可以擺脫java的單一繼承模型給你帶來的所有細微差別和限制。 public interface IFoo {public void foo();} – 2010-07-24 14:28:05

回答

6

你可以這樣做嗎?

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

但是,請看到一些其他意見在這個問題上,因爲過度使用的instanceof有時(並不總是),你需要重新考慮你的設計的標誌。

+0

謝謝,我會考慮改變我的設計。這只是它增加了許多樣板,總是使用C型。 – 2010-07-24 14:11:06

+0

instanceof就像goto,如果你使用它,那麼你需要花時間並重構你的源碼:) – vach 2014-12-24 14:18:28

2

可以使用的instanceof

Object obj = getAB_Or_C(); 

if (obj instanceof C) { 
    C c = (C) obj; 
} 
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. 
    } 
} 
+0

SOmetimes,有時不是。 A沒有任何方法使用foo()方法,並且您可能無法更改類A. – 2010-07-24 13:42:16

+0

我無法更改類A - 它是GWT UI包的一部分。 – 2010-07-24 14:13:06

+3

下次將這些信息添加到您的問題。 – 2010-07-24 14:38:52

2

作爲替代instanceof,考慮

interface Fooable { void foo(); } 

class A implements Fooable { ... } 
相關問題