2017-01-09 51 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类型。