2012-02-17 83 views
0

這裏有一個簡單的例子:Java泛型 - 何時需要參數化?

class World<S extends Sprites, B extends Bodies> { 

// Both of these have a problem... 

static World world = null; // "World is a raw type. References to generic type 
          // World<BOD,SPRT> should be parameterized" 

static World<S, B> world = null; // "Cannot make a static reference to the non-static type S 
         // "Cannot make a static reference to the non-static type B 

// The following is allowed but looks ugly/fishy to me 
static World<?, ?> world = null; // 

如果你想知道,我想獲得一個單例模式去。挑戰在於這個類在一個單獨的包GAME中進行了擴展,並且我不能讓這個包(MODEL)對該GAME有任何依賴。因此構造函數必須是MODEL。因此,構造函數可以將單例對象存儲在MODEL中該類的靜態變量中。

static World<?, ?> world = null;是否確實醜陋在你看來,有沒有更好的方法來解決這個問題?謝謝!

+3

請記住,Java有類型擦除;無論有多少種不同的方式來實例化World類(因爲它們都與運行時一樣共享相同的類),只有一個靜態的'world'變量。 – 2012-02-17 20:02:55

+0

我不會讓世界成爲單身/靜態。當你在兩個世界存在的情況下寫一個不同的遊戲時會發生什麼?無論如何,在我看來,這取決於你的'GAME'包中的任何內容,以確保_it_只創建一個'World'。這在現在的方式回答你的問題,它避免了這個問題。 – 2012-02-17 20:33:48

+0

好點...其實我的GAME包實現了一個傳統的單身人士,以確保只有一個... – pitosalas 2012-02-18 22:44:57

回答

4

您不能在靜態方法或字段中訪問泛型類型參數,如this answer中所述。由於靜態字段在類的所有實例之間共享(在這種情況下,我猜你的類將是型號),這將如何同時適用於Model<Sprites, Bodies>Model<ClassA, ClassB>

+0

是的,這是非常有意義的......它解釋了爲什麼靜態世界未能編譯。然而世界如何擺脫它呢? – pitosalas 2012-02-18 22:45:58

+0

@pitosalas因爲'?'是一個通配符,意思是「任何類型」。因此,在這種情況下'World '就像是在編寫普通的'World',並且不受'Model '的類型參數的約束(記住這是編譯錯誤的根源)。 – 2012-02-18 22:53:46

+0

難道人們認爲在這樣的情況下寫作世界是醜陋的還是完美的清潔?它是否比編寫純淨的世界更醜陋,這也被接受並帶有警告? – pitosalas 2012-02-18 23:05:58

2

當然,如果你想要一個單例,你必須知道單個實例中引用的確切類型是什麼。

也許如果您在示例中添加更多細節,這將不再是真實的,但據我所知,您不需要此處的泛型。如果你想表達的是你存儲的字段SpritesBodies可以是這些類的任何子類,只要用這些類型聲明這些字段,繼承就會處理其餘的部分。

想想這個名稱:「泛型」,它將用於某些將在不同環境中重複使用的內容。就像定義一個樹結構的類一樣,它可以容納任何類的對象。有時很難判斷您是否需要仿製藥。但是,單身絕對是極性相反的;沒有什麼比單身人士更通用:一個班級,一個單一的實例。

P.s .:然而有Enum s,它們都是通用的並且具有固定數量的實例,self-bound generic types是這些情況的解決方案,但我幾乎可以肯定你不需要這個。

+0

是的,我知道前面......但是,還有其他原因,導致我使用泛型必須與保持包裝分離的密封性,同時避免大量煩人的鑄造。事實上,這個模型來自另一個StackOverflow線程:http://stackoverflow.com/questions/9270466/java-generics-having-trouble-with-a-tricky-situation/9280277#9280277 – pitosalas 2012-02-18 22:48:29

+0

@pitosalas也許一個更大的代碼樣本和一些解釋可以幫助我們確定您需要的解決方案。就目前而言,你的問題的答案確實是你無法參數化靜態字段。 – biziclop 2012-02-19 13:34:37

+0

我毫不猶豫地給這個列表加上一個更長的代碼示例......我不想被打耳光:) – pitosalas 2012-02-20 14:28:15