添加到传递给方法的通用集

时间:2013-03-08 11:54:19

标签: java generics collections

我们说我有以下课程:

  • 动物

Animal是基类,cat,dog和cow的每个子类。

我现在有一个Set<Cat>Set<Dog>Set<Cow>,每个都以相同的方式使用,因此制作一个通用函数对它们进行操作是有意义的:

private boolean addObject(Animal toAdd, Animal defVal, Set<? extends Animal> vals)

这很好用,我可以自由地传递我的套装没有问题。

出现问题:我无法尝试将Animal toAdd添加到参数val。谷歌搜索显示,如果我将方法改为:

private boolean addObject(Animal toAdd, Animal defVal, Set<? super Animal> vals)

我将能够将Animal添加到参数val。这是有效的,除了现在,我不能通过我的子集我的猫,狗和奶牛。进一步的研究告诉我,以下工作,没有警告启动:

private <T> boolean addObject(T toAdd, T defVal, Set<? super T> vals)

问题在于,我需要能够执行Animal所有的方法调用。使用简单的演员阵容很容易解决这个问题:

((Animal)toAdd).getAnimalType()

有没有解决这个问题的方法,所以我可以保留通用功能,而不需要转换?除了制作我的所有基本类型的集合,在这个例子的情况下是动物吗?

1 个答案:

答案 0 :(得分:13)

好的研究,你几乎就在那里。您只需要为T添加上限。

private <T extends Animal> boolean addObject(T toAdd, T defVal, Set<? super T> vals)