如何在Java中实现泛型方法来管理类的属性?

时间:2017-03-30 10:14:57

标签: java oop

我有一个包含两个集合的Container类:一个类型为A,另一个类型为B。我希望在我的类中有一个方法可以接收类型为AB的参数,并将其添加到相应的集合中。 顺便说一下,我不确定是否应该使用接口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{

}

3 个答案:

答案 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");

    }
}