10

为什么这是错误的:

    Class<? extends Number> type = Integer.class;
    ArrayList<type> = new ArrayList<>();

?

给定一个类对象,有没有办法实例化一个特定类型的类?


显然我永远不会直接这样做,这只是一个说明需要什么的例子。在我需要的实际代码中,我不知道类型的名称。例如

    public void createAList(Class<? extends Number> type)  
{
    ArrayList<type> toReturn = new ArrayList<>();
    return toReturn;
}
4

7 回答 7

9
<T extends Number> ArrayList<T> createAList(Class<T> type)  
{
    ArrayList<T> toReturn = new ArrayList<>();
    return toReturn;
}


ArrayList<Integer> intList = createAList(Integer.class);
于 2013-03-07T19:58:39.627 回答
4

这不是你使用泛型的方式。您不使用Class对象,而是直接在代码中使用类名。

ArrayList<Integer> = new ArrayList<>();
于 2013-03-07T19:50:43.193 回答
3

感受一下java Class(实际上也是通用的)对象和类名之间的区别。

您应该使用指定泛型类型的类名。

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;
}
于 2013-03-07T19:54:34.437 回答
2

AnArrayList<>必须具有它拥有的特定类型。您可以在其中放置该类型或任何子类型的对象。

所以使用

List<Number> = new ArrayList<Number>();

你可以把Integers它放进去

请注意我如何使用左侧的接口和等号右侧的类。这是一种最佳实践。

如果您想要一个仅包含Integer(根据您的示例)的列表,@irreputable 的答案是您最好的选择。这个答案将成立Integer,但不仅仅是Integer.

于 2013-03-07T19:52:50.220 回答
1

从字面上看,其他答案关于如何实现的建议createAList忽略了一些重要的事情:由于类型擦除,这种方法毫无意义。

给定你想要一个List<? extends Number>,你可以这样写:

List<? extends Number> lst = new ArrayList<>();

如果你只想要一个List<?>,你可以写:

List<?> lst = new ArrayList<>();

如果您在类型参数的范围内T并且想要 a List<T>,您可以编写:

List<T> lst = new ArrayList<>();

请注意,Class对象与这些构造函数调用无关,就像其他答案中的方法一样。这是因为在运行时,ArrayList实例不知道也不关心它的引用在运行时的泛型类型。

于 2013-03-07T21:06:11.213 回答
1

你甚至不需要传入参数:

public <T extends Number> ArrayList<T> createAList () {
    return new ArrayList<T>();
}

尽管您可能需要在调用时显式指定类型参数:

ArrayList<Integer> intList = this.<Integer>createAList();
于 2013-03-07T23:19:09.313 回答
0
ArrayList<type> = new ArrayList<>();

这条线是错误的。首先,您在这里错过了标识符(变量名);其次,您混合了“类型”和“类”的概念。你可以不关心

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>();
}
于 2013-03-07T20:24:03.603 回答