从类对象在Java指定通用类型(Specifying a generic type in java

2019-07-21 03:54发布

为什么这是错的:

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

难道就没有办法实例化一个类提供类对象特定类型的?


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

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

Answer 1:

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


ArrayList<Integer> intList = createAList(Integer.class);


Answer 2:

这不是你如何使用泛型。 不要使用一个Class的对象,您可以直接在代码中使用的类名。

ArrayList<Integer> = new ArrayList<>();


Answer 3:

感觉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;
}


Answer 4:

一个ArrayList<>必须具有其持有特定的类型。 你可以把该类型或任何子类型的对象中它虽然。

因此,使用

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

你可以把Integers

注意我是如何用在左侧,接口的类上等号的右边。 这是一个最佳实践之类的事情。

如果你想将牵住列表Integer (按你的例子)通过@irreputable答案是你最好的选择。 这个答案将持有Integer ,但不只是Integer.



Answer 5:

从字面上,对方回答如何落实建议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实例并不知道也不关心任何泛型类型的引用了在运行时。



Answer 6:

你甚至不需要在参数来传递:

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

虽然你可能需要明确指定调用时的类型参数:

ArrayList<Integer> intList = this.<Integer>createAList();


Answer 7:

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


文章来源: Specifying a generic type in java from Class object