Java:如何确定抽象类型的具体类型?

时间:2014-01-28 11:20:28

标签: java abstract-class

我有一个方法

public static Set<MyClass> doSomething(Set<MyClass> oldSet) {

  //I don't necessarily want this to be a HashSet
  Set<MyClass> newSet = new HashSet<MyClass>();

  //Add some things to newSet

  return newSet;
}

有没有什么方法可以返回与Set中传递的相同的具体类型? (无需返回oldSet)。不幸的是,无法克隆集。

示例

如果oldSet是TreeSet,我还希望返回的set(newSet)是一个TreeSet。

3 个答案:

答案 0 :(得分:5)

尝试

Set<MyClass> doSomething(Set<MyClass> oldSet) {

  Set<MyClass> newSet =oldSet.getClass().newInstance();

  return newSet;
}

仅当具体类的oldSet具有不带参数的构造函数时才有效。

答案 1 :(得分:1)

是的,使用反射:

Class<? extends Set<MyClass>> type = oldSet.getClass();
Constructor ctor = type.getConstructor();
Set<MyClass> newSet = ctor.newInstance();

(从我的头脑中,你将不得不添加几种类型和大量的异常处理程序。)

您也可以克隆集:

Class<? extends Set<MyClass>> type = oldSet.getClass();
Constructor ctor = type.getConstructor( Collection.class );
Set<MyClass> newSet = ctor.newInstance( oldSet );

答案 2 :(得分:0)

您可以遍历该集合,克隆集合中的每个对象并将其放入新集合中。假设MyClass是可克隆的。