为什么这是错的:
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
UPD:
使用此方法,如果你只知道在运行时类型:
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>();
}
虽然你可能需要明确指定调用时的类型参数:
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>();
}