2014-10-28 76 views
3

我正在研究涉及從字符串/流中讀取結構的項目。 作爲我設計的一部分,我試圖創建這些方針的東西:Java - 衝突的接口類型參數

  • public class Thing;
  • public class SpecialThing extends Thing;
  • public class ShinyThing extends Thing;
  • public abstract class ThingDeserialiser implements Iterable<Thing>;
  • public abstract class GenericThingDeserialiser<T extends Thing> extends ThingDeserialiser implements Iterable<T>;
  • public class SpecialThingDeserialiser extends GenericThingDeserialiser<SpecialThing>;
  • public class ShinyThingDeserialiser extends GenericThingDeserialiser<ShinyThing>;

但是我得到GenericThingDeserialiser錯誤,因爲有

  • ThingDeserialiser實施Iterable<Thing>
  • GenericThingDeserialiser試圖實現Iterable<T>之間的衝突。

我能夠在C#中創建像這樣的設置,爲什麼我無法在Java中做到這一點?

有沒有辦法解決這個問題?


我也認爲,希望ShinyThingDeserialiserSpecialThingDeserialiser可能都被強制轉換爲GenericThingDeserialiser<Thing>去除ThingDeserialiser,但預計這不會工作。

我有另一個涉及接口的想法,但我想在繼續之前停下來尋求建議。

如果不明顯,總體思路是基於合理的微不足道的模式從字符串/流中檢索Thing對象。

+0

@CarlosBribiescas我以我的方式嘗試事物的主要原因是我對C#和C#中的工作有更多的經驗,所以我習慣於這樣的工作。我在頂部有一個ThingDeserialiser的主要原因是我可以收集一些ThingDeserialiser,它們可以是任何形式的GenericThingDeserialiser或者任何其他的鏈接。此外,可以擴展「ThingDeserialiser」,而不是通用版本,例如包裝可能生成「ShinyThing」或「SpecialThing」的工廠。長話短說:靈活性。 – Pharap 2014-10-28 13:04:47

回答

2

我肯定會建議刪除ThingDeserialiser。你說你想將ShinyThingDeserialiser和SpecialThingDeserializer投射到GenericThingDeserialiser < Thing>,但那不行。你應該可以將它們投射到GenericThingDeserialiser <?延伸Thing>。這有幫助嗎?

+1

啊,我完全忘記了通配符。謝謝你提醒我他們存在。 – Pharap 2014-10-28 12:54:03

4

我能夠在C#中創建這樣的設置,爲什麼我無法在Java中執行此操作?

因爲Java中的泛型不是協變的。

也就是說,即使你有類型ABB擴展A,類Foo<B>不會是Foo<A>一個亞型。由於類型擦除,在運行時,兩者都將是Foo

正如已經暗示的那樣,您應該在這裏擺脫ThingDeserialiser,並且僅僅使用GenericThingDeserializer<T extends Thing> implements Iterable<T>。然後,您可以創建,例如,MyThingDeserialiser implements GenericThingDeserialiser<MyThing>

+1

「因爲Java中的泛型不是協變的。」這正是我期待的答案。我最初確實接受了這一點,但是@David對通配符提出了一個很好的觀點,理想情況下我願意接受這兩個通配符,但由於他的代表略低,所以我接受了他的答案。 – Pharap 2014-10-28 12:53:09

+0

多數民衆贊成你Pharap。至於fge,我把你的答案upvoted;) – 2014-10-28 12:55:41

+0

@DavidtenHove可能違反網站的指導方針,但我以前見過。再一次,我希望能夠接受兩者,但它可能需要更多的努力,而不是提供獎勵。 – Pharap 2014-10-28 13:11:56