在java中从类对象指定泛型类型



为什么这是错误的:

    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的列表(根据你的例子),@ irreputation的答案是你最好的选择。这个答案将包含Integer但不只是Integer.

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

如果你想要一个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<>();

这一行是错误的。首先,这里遗漏了标识符(变量名);其次,你混淆了"类型"one_answers"类"的概念。你可以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>();
}

相关内容

  • 没有找到相关文章

最新更新