1

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

假设我想将一个对象添加到集合中;无论集合类型如何。通过使用泛型和 T 扩展集合,这将很容易。但是,现在假设我还想通过创建一个新集合来处理我的集合为空的情况;但我希望返回的集合是调用方法想要的类型。所以是这样的:

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 不会费心编写解决它的方法;还是编译器和运行时交互的方式有什么使这变得不可能或极其困难?

4

1 回答 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()

于 2013-04-10T16:21:13.923 回答