2015-05-28 178 views
-2

我有2個抽象類:ScreenWorld。兩者都執行IState。 所以我想使用具體類的泛型類型來繞過類的投射。泛型類混淆

public abstract class World<S extends Screen> implements IState{/*body*/} 

public abstract class Screen<W extends World> implements IState{/*body*/} 

public final class SomeWorld extends World<SomeScreen> {} 

public final class SomeScreen extends Screen<SomeWorld> {} 

有沒有錯誤,但在第二個抽象類的警告告訴我,我錯過了一般的論點。所以我暫時保留警告

public abstract class World<S extends Screen<?>> implements IState{/*body*/} 

public abstract class Screen<W extends World<?>> implements IState{/*body*/} 

我是否以正確的方式使用泛型或任何更好的解決方案?

編輯:假設在SomeWorld類中有沒有在抽象的世界方法中聲明的doSomething()方法。我怎麼能在一些屏幕實例中調用world.doSomething()而不投射: ((SomeWorld)世界).doSomething()

+6

似乎你不需要在這裏通用,你究竟是什麼意思*「所以我想使用具體類的泛型類型,以繞過類的鑄造。」* –

+6

你確定你想在你的班級的循環設計? – MKorsch

+0

不能說你是否正確使用泛型,沒有更多關於你想要實現的細節。請詳細說明,特別是「屏幕」和「世界」之間的關係(爲什麼你需要每種類型都依賴於其他類型)。 –

回答

0

感謝您的闡述。

如果你有一個類型的World一個變量(或表達式),要調用該公司在SomeWorld上定義的方法,你只有兩種選擇:

演員:((SomeWorld) world).doSomething();

思考:world.getClass().getMethod("doSomething").invoke(world);

Java不會讓您直接引用對象的字段或方法,這些字段或方法未在編譯器針對該對象在編譯時推導的任何類型中聲明。

Casting允許您將表達式更改爲具有所需類型的表達式,因此編譯器的要求得到滿足,但它在運行時提高了ClassCastException的可能性。

反射允許您在轉換不可能時轉到那些方法。 (例如,當你不知道對象是什麼類型,但是如果它有一個,你想調用其方法)。在這種情況下可能會引發各種例外情況。

順便說一下,你的循環類型依賴於WorldScreen是很少見的東西,因此高度懷疑,雖然沒有技術上不正確。

+0

感謝您的回答。這就是爲什麼我想使用泛型類型 – Nathan