2014-01-28 59 views
0

我有一个方法Java:如何确定抽象类型的具体类型?

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; 
} 

有什么办法,我可以返回相同的具体类型,在设定的通过? (不必返回oldSet)。不幸的是,集合不能被克隆。

如果oldSet是一个TreeSet,我也想返回的集合(newSet)是一个TreeSet。

+3

你的问题并不清楚,至少对我而言。请改善 – Keerthivasan

+0

我已经添加了一个例子 - 这样更好吗? –

+0

阿列克谢的回答是完美的 – Keerthivasan

回答

5

尝试

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

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

    return newSet; 
} 

这只能如果具体类oldSet有没有参数的构造函数。

+1

所有集合应该有这样一个构造函数,根据'Collection' JavaDoc:>>>“所有通用集合实现类...应该提供两个”标准“构造函数:void(无参数)构造函数,...以及一个带有一个Collection类型的单个参数的构造函数,它创建一个与它的参数具有相同元素的新集合。“<<<。 – Marco13

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); 
0

你可以通过设置,克隆组中的每个对象,并把它变成新的设定。这是假设MyClass是可复制的。