2017-01-09 71 views
0

我實現了一個通用類,我想創建一個變量與特定類型的,由用戶選擇。 我想,無論用戶選擇什麼,該變量的名稱將是相同的。爪哇 - 如何選擇泛型類類型「這去」

到目前爲止,我已經得到了什麼:

public class MyGeneric <T> 
{ 
... 
} 

主:

if(choice==1) 
    MyGeneric<Integer> item = new MyGeneric<Integer>(); 
else 
    MyGeneric<String> item = new MyGeneric<String>(); 

我知道內if該聲明是被禁止的。

我該怎麼辦?


這樣做的原因是that

第一個選項是更具可讀性和「一般」 ..

+2

第1步:瞭解泛型是,而他們不是。 –

+2

一個'如果-statement'內聲明的變量不是「禁止」,它只是限制了範圍。 – CraigR8806

+0

你爲什麼想這樣做?無論你想要做什麼,這都不是做到這一點的方法。 – khelwood

回答

5

我猜你想做的事:

MyGeneric<?> item; 
if (choice == 1) { 
    item = new MyGeneric<Integer>(); 
} else { 
    item = new MyGeneric<String>(); 
} 

但問題是:當你開始使用泛型這樣......你失去了他們所有的優點。仿製藥的本質是給你一定的類型安全可以由編譯器執行。

您的想法使用「相同的項目」,無論使用什麼樣的通用類型真的使用矛盾那意圖。你可以和那麼忘記有關使用泛型和簡單的使用對象所有的地方。

換句話說:所使用的具體通用類型是項的「類型」的必不可少一部分。在一個唯一有效的使用情況下,我在這裏看到的會更多樣子:

MyGeneric<? extends Number> item; 
if (choice == 1) { 
    item = new MyGeneric<Integer>(); 
} else { 
    item = new MyGeneric<Float>(); 
} 

(你使用某種形式的項目約束可以以不同的方式來實現的)

+0

我的編輯改變了你的答案? –

+0

我不這麼認爲。你會發現 - 例如,如果你有一個Integer列表或者一個字符串列表,它會使**變得不同。您只將整數添加到第一個列表中,並且只將字符串添加到第二個列表中。從這個意義上說,我認爲安迪的第一個命令是有點點的:你應該首先更好地理解泛型;也許你可以問一個更好的問題......或者相應地重新設計你的設計。 – GhostCat

+0

讓...感謝很多! –

0

不要忘記,在Java中使用泛型(https://docs.oracle.com/javase/tutorial/java/generics/erasure.html)時,有一個東西叫做類型擦除。它們在運行時不可用。

實際上,如果您確實想知道MyGeneric中的類型,則必須在MyGeneric類中存儲MyGeneric類型。例如:

class MyGeneric{ 
private Class type; // (as an instance variable of MyGeneric). 
} 

然後影響你的if類型。