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

Java:如何确定抽象类型的具体类型?,java,abstract-class,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; } 公共静态设置do

我有办法

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;
}
公共静态设置doSomething(设置oldSet){
//我不一定希望这是一个哈希集
Set newSet=newhashset();
//向新闻集中添加一些内容
返回新闻集;
}
是否有任何方法可以返回与传入集合相同的混凝土类型?(无需返回旧集)。不幸的是,无法克隆集合

示例

如果oldSet是树集,我还希望返回的集(newSet)是树集。

是,使用反射:

Class<? extends Set<MyClass>> type = oldSet.getClass();
Constructor ctor = type.getConstructor();
Set<MyClass> newSet = ctor.newInstance();
Class是,使用反射:

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

Class您可以浏览集合,克隆集合中的每个对象并将其放入新集合。这是假设MyClass是可克隆的。

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

试试看

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

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

  return newSet;
}
Set doSomething(Set oldSet){
Set newSet=oldSet.getClass().newInstance();
返回新闻集;
}
只有当oldSet的具体类有一个没有参数的构造函数时,这才有效。

try

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

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

  return newSet;
}
Set doSomething(Set oldSet){
Set newSet=oldSet.getClass().newInstance();
返回新闻集;
}

只有当oldSet的具体类有一个没有参数的构造函数时,这才有效。

你的问题不清楚,至少对我来说是这样。请改进我已经添加了一个例子-这更好吗?Alexei的答案是完美的,不管它值多少钱,这似乎是个坏主意。你的问题不清楚,至少对我来说是这样。请改进我已经添加了一个示例-这更好吗?Alexei的答案是完美的,不管它值多少钱,这似乎是个坏主意。所有集合都应该有这样一个构造函数,根据
集合
JavaDoc:>>>“所有通用集合实现类……都应该提供两个“标准”构造函数:一个void(无参数)构造函数,…和具有一个Collection类型参数的构造函数,该构造函数创建一个具有与其参数相同元素的新集合。“根据
Collection
JavaDoc:>>“所有通用集合实现类…应提供两个”标准的“构造函数:一个void(无参数)构造函数,…和一个具有Collection类型的单个参数的构造函数,该构造函数创建一个新集合,其元素与其参数相同