繁体   English   中英

从Class对象中指定Java中的泛型类型

[英]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

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

尽管在调用时可能需要显式指定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM