我想实现一个类来实例化泛型类型。
public class DisjointSet<T extends Set<E>, E> {
private final Class<T> setType;
public DisjointSet(Class<T> setClass) {
this.setType = setClass;
}
public void doSomething(E Element) {
T set = setClass.newInstance();
set.add(element);
}
}我尝试像这样实例化这个类:
DisjointSet<HashSet<Integer>, Integer> disjointSet = new DisjointSet<>(HashSet<Integer>.class);但是,似乎不允许在泛型类型上使用.class。如何正确地将所需的泛型类传递给构造函数?
发布于 2018-05-20 18:14:59
不确定在参数化类型中公开内部集类型(Hash与其他类型)是否好。实际上,由于类型擦除,您不能直接实例化参数化类型,但是可以在工厂中传递,
package langGenerics;
import java.util.HashSet;
import java.util.Set;
public class UseGenerics {
public static void main(String[] args) {
SetFactory<Integer> setFactory = HashSet::new;
DisjointSet<Integer> disjointSet = new DisjointSet<>(setFactory);
disjointSet.doSomething( 123 );
}
}
interface SetFactory<T> { Set<T> get(); }
class DisjointSet<T> {
private SetFactory<T> setFactory;
public DisjointSet(SetFactory<T> setFactory) {
this.setFactory = setFactory;
}
public void doSomething(T item) {
Set<T> set = setFactory.get();
set.add(item);
}
}发布于 2018-05-20 18:02:15
如果您真的想插入您自己的集存储,那么我建议您将Supplier传递给构造函数:
public static class DisjointSet<T extends Set<E>, E> {
T set;
public DisjointSet(Supplier<T> supplier) {
set = supplier.get();
}
public void doSomething(E element) {
set.add(element);
}
}然后使用它:
DisjointSet<HashSet<Integer>, Integer> set = new DisjointSet<>(HashSet::new);发布于 2018-05-20 18:08:09
如果这是你想要的,
public class DisjointSet<T extends Set<E>, E> {
private final Class<T> setType;
public DisjointSet(Class<T> setClass) {
this.setType = setClass;
}
public static void main(String[] args) {
DisjointSet<HashSet<Integer>, Integer> disjointSet = new DisjointSet(new HashSet<Integer>().getClass());
}
}https://stackoverflow.com/questions/50437835
复制相似问题