我有一个包含两个集合的Container类:一个类型为A
,另一个类型为B
。我希望在我的类中有一个方法可以接收类型为A
或B
的参数,并将其添加到相应的集合中。
顺便说一下,我不确定是否应该使用接口Something
。请注意,我希望避免使用getClass()
或instanceof
检查接收参数的类类型,因为我的项目中有很多集。
我怎样才能做到这一点?
谢谢,
public class Container{
privte Set<A> a;
privte Set<B> b;
public Container(){
a = new HashSet<>();
b = new HashSet<>();
}
//getters and setters
//generic method
public void addAorB(Something instance){
//add to the coresponding Set
}
}
public class A implements Something{
}
public class B implements Something{
}
答案 0 :(得分:3)
假设泛型类型是析取的,我会将所有集合放入一个映射中,每个集合的类型都是键。为了避免重复的代码,我还会创建一个创建集合并将其放入地图的方法。
private final Map<Class<?>, Set<? extends Something>> sets = new HashMap<>();
public Container() {
a = createAndPut(A.class);
b = createAndPut(B.class);
}
private <T extends Something> Set<T> createAndPut(Class<T> type) {
Set<T> set = new HashSet<>();
sets.put(type, set);
return set;
}
如果您只需要set-instances添加元素,则可以丢弃它们。如果没有为给定实例注册集,则可以添加空检查。
public void addAorB(Something instance){
Set<? extends Something> set = sets.get(instance.getClass());
if (set == null)
set = createAndPut(instance.getClass());
((Set<Something>) set).add(instance);
}
答案 1 :(得分:0)
方法重载不会起作用吗?
svg.select("path").transition().attr('transform', "translate(" + x(data[0].time) + ",0)");
答案 2 :(得分:-1)
public void addAorB(Something instance){
//add to the coresponding Set
if instance instanceof A
a.add(instance);
else if instance instanceof B
b.add(instance);
else
throw new Exception("class not supported");
}
}