从Class对象中指定java中的generics类型
为什么这是错的:
Class type = Integer.class; ArrayList = new ArrayList();
?
在给定类对象的情况下,是否无法实例化特定类型的类?
显然我永远不会直接这样做,这只是展示所需内容的一个例子。 在我需要的实际代码中,我不知道该类型的名称。 例如
public void createAList(Class type) { ArrayList toReturn = new ArrayList(); return toReturn; }
ArrayList createAList(Class type) { ArrayList toReturn = new ArrayList<>(); return toReturn; } ArrayList intList = createAList(Integer.class);
这不是你如何使用generics。 您不使用Class
对象,直接在代码中使用类名。
ArrayList = new ArrayList<>();
感觉java Class (实际上也是通用的)对象和类名之间的区别。
您应该使用指定generics类型的类名。
ArrayList = new ArrayList<>(); // ArrayList = new ArrayList<>(); <- WRONG
UPD:
如果您只知道运行时的类型,请使用此方法:
public void createAList(Class type) { ArrayList toReturn = new ArrayList<>(); return toReturn; }
ArrayList<>
必须具有它所拥有的特定类型。 您可以将该类型的对象或任何子类型放入其中。
所以用
List = new ArrayList ();
你可以把Integers
放进去
注意我是如何使用左边的界面和等号右边的类的。 这是最好的做法。
如果你想要一个只能容纳Integer
的列表(根据你的例子)@irreputable的答案是你最好的选择。 这个答案将包含Integer
而不仅仅是Integer.
从字面上看,另一个回答’关于如何实现createAList
的建议忽略了一些重要的东西:由于类型擦除 ,这种方法毫无意义。
鉴于你想要一个List extends Number>
List extends Number>
,你可以这样写:
List extends Number> lst = new ArrayList<>();
如果你只想要一个List>
,你可以写:
List> lst = new ArrayList<>();
如果您在类型参数T
的范围内并且想要List
,则可以编写:
List lst = new ArrayList<>();
请注意, Class
对象与这些构造函数调用无关,就像其他答案中的方法一样。 这是因为在运行时, ArrayList
实例不知道或关心其引用在运行时具有的任何generics类型。
你甚至不需要传递一个参数:
public ArrayList createAList () { return new ArrayList (); }
虽然您可能需要在调用时显式指定type参数:
ArrayList intList = this. createAList();
ArrayList = new ArrayList<>();
这条线是错的。 首先,你在这里错过了标识符(变量名); 其次,你混合了“类型”和“类”的概念。 你可以delcare
ArrayList list = new ArrayList<>();
但根据你的说法, type = Integer.class
。 显然, Integer
并不等同于Integer.class
。 同样,你不能拥有Integer.class i = 1;
前者是“类型”,第二个是“类”对象。
您可以创建一个通用方法:
public List createAList (Class type) { return new ArrayList (); }