调用泛型参数的构造函数,或者获取类对象(或者为什么不起作用?)

问题描述 投票:0回答:1

我现在只是为了好玩而喜欢java。

假设我想将一个对象添加到集合中;无论集合类型如何。 那会 通过使用泛型(T extends Collection)可以很容易。 然而,现在可以说我也 想要通过创建一个新集合来处理我的集合为空的情况;但 我希望返回的集合是调用方法想要的类型。 所以像这样:

public <T extends Collection<MyObject> addToCollection (Myobject object, T collection){
    if(collection==null)
        collection=new T();

    collection.add(object);

    return collection;
}

显然我不能调用 new T(),但是有等效的方法吗? 通过反射我可以做到这一点,但是反射假设我知道类 T 是什么,并且如果集合为空,我不能只调用“collection.getClass()”我的直觉是这是不可能的,因为编译器无法推断类型;只是理论上似乎应该是可行的

如果我做了一个类似这样的方法

HashSet<MyObject> set=addToCollection(object, null);

我可以在运行时看到,当我调用这个集合时,我期望返回一个 HashSet,因此理论上我可以告诉该方法它期望 T 的类型是什么,因此我的方法现在将创建什么集合。 我强烈怀疑 Java 不会这样做;但如果不是,那就是不实现此功能的原因,因为它是一种极端情况,Sun/Oracle 懒得编写解决它的方法;或者编译器和运行时交互的方式是否有某些因素使得这变得不可能或极其困难?

java generics reflection
1个回答
1
投票

如果集合为空,您需要告诉您的方法要创建什么类型的集合。为此,您可以将类作为参数传递。

public <T extends Collection<String>> T addToCollection(String object, T collection, Class<T> clazz) {
if (collection == null)
    collection = clazz.newInstance();

collection.add(object);

return collection;
}

编辑

如注释中所示,重要的是要注意,只有当构造函数具有零参数并且已经可访问时,

Class.newInstance()
才会成功。否则就需要使用
Constructor.newInstance()

© www.soinside.com 2019 - 2024. All rights reserved.