2011-02-24 75 views
0

以這種方式創建一個通用對象數組是否有任何缺點或性能問題?泛型類型數組的一種可能的方法?

QueryObjects instances[] = (QueryObjects<String,String,String>[]) new Object[10];

編輯:我甚至在想,如果我能,而不是依靠這樣的: -

QueryObjects instances[] = new QueryObjects[10];

主要的原因之中,我也不想修復泛型爲<String,String,String>,因爲有時它也可以像<Integer,Integer,Integer>那樣用於某些數組元素。所以我想把它作爲運行時選擇。由於這主要是針對應用程序的內部工作,而不是針對任何客戶端輸入,因此也許我不應該面臨錯誤輸入的危險。

+0

你沒有完成任何演員。將不會執行類型檢查以確保它是''。 – 2011-02-24 18:53:39

+0

謝謝喬納森!我只是添加了一些更多的信息給我的問題..請有一個簡短的看看.. – 2011-02-24 19:09:12

回答

2

以這種方式創建它有一個缺點:你現在有什麼真正的Object僞裝成一個數組QueryObjects。如果其他人提及同一陣列(並且知道它是Object[]),則他們可以將一些Object放入其中,例如,一個String,然後當您嘗試通過引用數組來訪問String時,程序將拋出ClassCastException。解決方案:像這樣創建:

QueryObjects<String, String, String> instances[] = new QueryObjects[10]; 
+3

-1在Java中不能做任何一個。這兩個都給你一個編譯錯誤:'不能創建QueryObject的通用數組' – 2011-02-24 18:44:10

+0

@Jonathon我的壞 - 我一直在編程太多的C#。無論如何,提供未經測試的代碼是sl;不馴的;對不起,謝謝你指出。我的更新的解決方案_is_測試...(我的關於'ClassCastException'的爭論仍然是正確的,但我; _did_測試...) – 2011-02-24 18:50:44

+0

投票反過來。假設你不介意未經檢查的警告,這將起作用。 Java泛型是非常糟糕的:( – 2011-02-24 18:52:13

2

您的代碼將在運行時生成ClassCastException

您應該創建QueryObjects[]類型的數組,並將其轉換爲QueryObjects<String, String, String>[],還是將來,如果你需要創建一個變量類型的數組(例如,T[]),使用反射:How to create a generic array in Java?

1

它迴避問題「如果您使用泛型,爲什麼要使用數組而不是類型結構?」

而不是試圖實現QueryObjects[]並做得不好,爲什麼不創建一個類型呢?然後你可以添加你想要的任何方法。耶對象定位!

class QuerySet<O extends QueryObjects<A,B,C>> { 
    O[] objects; 
} 
+0

作爲一個附註,我可能在'>'上有語法錯誤。目前我沒有時間來測試它的語法準確性。 – corsiKa 2011-02-24 19:08:43

+0

謝謝glocoder!我只是試了一下..這種語法似乎工作 '類QuerySet {' 'O []對象;' '}' 這可以滿足我在編輯中提到的需求。 。像這個數組的某些元素可以是,而其他元素可以像。 – 2011-02-24 19:38:46

+0

如果行爲相同,那麼可以。如果行爲因Integer或String而不同,則不應使用泛型。想想什麼通用手段! – corsiKa 2011-02-24 21:06:51

2

「正義」 的方式是

QueryObjects<?,?,?>[] instances = new QueryObjects<?,?,?>[10]; 

原始的方法是蠻好的:

QueryObjects[] instances = new QueryObjects[10]; 

通知的類型聲明:

Type[] var 

Type var[] 

我不關心爲什麼Java允許第二種語法,它仍然沒有任何意義。