Java:如何确定抽象类型的具体类型?
问题描述:
我有一个方法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。
答
尝试
Set<MyClass> doSomething(Set<MyClass> oldSet) {
Set<MyClass> newSet =oldSet.getClass().newInstance();
return newSet;
}
这只能如果具体类oldSet有没有参数的构造函数。
+1
所有集合应该有这样一个构造函数,根据'Collection' JavaDoc:>>>“所有通用集合实现类...应该提供两个”标准“构造函数:void(无参数)构造函数,...以及一个带有一个Collection类型的单个参数的构造函数,它创建一个与它的参数具有相同元素的新集合。“ Marco13
答
是,使用反射:
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);
答
你可以通过设置,克隆组中的每个对象,并把它变成新的设定。这是假设MyClass是可复制的。
你的问题并不清楚,至少对我而言。请改善 – Keerthivasan
我已经添加了一个例子 - 这样更好吗? –
阿列克谢的回答是完美的 – Keerthivasan