我现在只是想开玩笑吧。
我想要将一个对象添加到集合中;无论收集类型如何。那会 通过使用泛型,使用T extends Collection很容易。但是,现在让我说也是 想要通过创建一个新集合来处理我的集合为null的情况;但 我希望返回的集合是调用方法所需的类型。所以像这样:
public <T extends Collection<MyObject> addToCollection (Myobject object, T collection){
if(collection==null)
collection=new T();
collection.add(object);
return collection;
}
显然我不能调用新的T(),但这样做是否存在一种平等的方式?通过反射,我可以做到,但反射假设我知道T是什么类,如果集合为null我不能只调用“collection.getClass()”我的直觉是由于编译器无法推断这是不可能的类型;从理论上讲,它似乎应该是可行的
如果我采用了类似
之类的方法HashSet<MyObject> set=addToCollection(object, null);
我可以在运行时看到,当我调用这个集合时,我期待一个HashSet回来,理论上我可以告诉方法它预期T的类型是什么,因此我的方法现在将收集到creaet。我强烈认为Java不会这样做;但如果没有实现这一功能的原因是因为它太过于边缘化,以至于Sun / Oracle不打算以一种方式来解决它;或者有什么关于编译器和方式的方式运行时交互使得这不可能或极其困难?
答案 0 :(得分:1)
如果collection为null,您需要告诉您的方法要创建的集合类型。为此,您可以将该类作为参数传递。
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()