[英]Specifying a generic type in java from Class object
为什么这是错误的:
Class<? extends Number> type = Integer.class;
ArrayList<type> = new ArrayList<>();
?
给定一个类对象,没有办法实例化特定类型的类吗?
显然,我永远不会直接这样做,这只是显示所需内容的一个示例。 在实际代码中,我需要不知道类型的名称。 例如
public void createAList(Class<? extends Number> type)
{
ArrayList<type> toReturn = new ArrayList<>();
return toReturn;
}
<T extends Number> ArrayList<T> createAList(Class<T> type)
{
ArrayList<T> toReturn = new ArrayList<>();
return toReturn;
}
ArrayList<Integer> intList = createAList(Integer.class);
那不是您使用泛型的方式。 您不使用Class
对象,而是直接在代码中使用类名称。
ArrayList<Integer> = new ArrayList<>();
感觉到java 类 (实际上也是通用的)对象和类名之间的区别。
您应该使用类名称指定通用类型。
ArrayList<Number> = new ArrayList<>();
// ArrayList<Number.class> = new ArrayList<>(); <- WRONG
如果仅在运行时知道类型,请使用此方法:
public <T extends Number> void createAList(Class<T> type) {
ArrayList<T> toReturn = new ArrayList<>();
return toReturn;
}
ArrayList<>
必须具有其持有的特定类型。 您可以在其中放置该类型或任何子类型的对象。
所以用
List<Number> = new ArrayList<Number>();
你可以把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<T>
,则可以编写:
List<T> lst = new ArrayList<>();
注意, Class
对象与这些构造函数调用无关,就像其他答案中的方法一样。 这是因为在运行时, ArrayList
实例不知道或不在乎其引用在运行时具有的通用类型。
您甚至不需要传递参数:
public <T extends Number> ArrayList<T> createAList () {
return new ArrayList<T>();
}
尽管在调用时可能需要显式指定type参数:
ArrayList<Integer> intList = this.<Integer>createAList();
ArrayList<type> = new ArrayList<>();
这条线是错误的。 首先,您在这里错过了标识符(变量名); 其次,您混合了“类型”和“类”的概念。 你可以delcare
ArrayList<Integer> list = new ArrayList<>();
但是根据您的输入,请type = Integer.class
。 显然, Integer
不等同于Integer.class
。 同样,您不能拥有Integer.class i = 1;
前一个是“类型”,第二个是“类”对象。
您可以创建一个通用方法:
public <T extends Number> List<T> createAList (Class<T> type) {
return new ArrayList<T>();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.