从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 List ,你可以这样写:

 List 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(); }