添加到传递到方法中的泛型集

2022-09-03 02:33:09

假设我有以下类:

  • 动物

动物是基类,猫,狗和牛每个子类它。

我现在有一个 ,它们中的每一个都以相同的方式使用,因此创建一个泛型函数来操作它们是有意义的:Set<Cat>Set<Dog>Set<Cow>

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

这很好用,我可以毫无问题地自由通过我的套装。

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

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

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

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

问题是,我需要能够执行Animal所有方法调用。这很容易使用简单的强制转换:

((Animal)toAdd).getAnimalType()

有没有办法解决这个问题,这样我就可以保留通用功能,而不需要强制转换?除了使我的集合成为基本类型的所有集合之外,在此示例中,动物?


答案 1

好研究,你快到了。您只需向 添加一个上限。T

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

答案 2