17

假设我有以下课程:

  • 动物

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

我现在有一个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)

我将能够将 Animal 添加到参数 vals。这行得通,除了现在,我不能传递我的子类猫、狗和牛。进一步的研究告诉我,以下工作,没有警告启动:

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

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

((Animal)toAdd).getAnimalType()

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

4

1 回答 1

13

很好的研究,你几乎就在那里。您只需要添加一个上限到T.

private <T extends Animal> boolean addObject(T toAdd, T defVal, Set<? super T> vals)
于 2013-03-08T11:57:27.023 回答