是否可以在没有演员表的情况下从 Animal 列表中获取 Dog 列表?
Posted
技术标签:
【中文标题】是否可以在没有演员表的情况下从 Animal 列表中获取 Dog 列表?【英文标题】:Is it possible to get a list of Dog from a list of Animal without a cast? 【发布时间】:2021-09-12 10:52:50 【问题描述】:我班上有一个protected Map<String, List<Animal>> animals;
。在我的构造函数中,我有
animals.put("dogs", new ArrayList<Animal>());
animals.put("cats", new ArrayList<Animal>());
一切正常,正如预期的那样。如果我想要Dog
或Cat
,我只需要从地图中获取并投射即可。
但是,如果我想要呢
animals.put("dogs", new ArrayList<Dog>());
Java
不允许我这样做。我也在this SO answers 中读到了它,但我需要它,因为我使用的是 JSF,并且我需要在页面的 EL 表达式中使用 Animal 没有的 Dog
方法。
自从我为Animal
创建了一个工厂后,我想使用工厂来获取正确的对象类型,但我觉得有点奇怪。
有什么方法可以使用animals.put("dogs", new ArrayList<Dog>());
或其他替代方法吗?
PS:我使用的是 Java 7
【问题讨论】:
好吧,您可以使用Map<String, List<? extends Animal>> animals;
,这将允许您执行animals.put("dogs", new ArrayList<Dog>());
,但您仍然无法在不强制转换的情况下从该地图中获得ArrayList<Dog>
。毕竟,映射可以包含其他键的其他类型,那么编译器怎么知道要在这里返回什么类型呢?您需要提供该演员表,可能使用 List<Dog> getDogs() return (List)animals.get("dogs");
之类的特定方法(原始演员表是必要的,因此编译器不会抱怨。
地图的泛型支持所有相同类型的值,并且您有一个地图,其中值的类型略有不同。听起来您应该使用Map<String, List<? extends Animal>>
,但如果您想以List<Dog>
而不是List<? extends Animal>
检索您的狗列表,您将不得不强制转换它。你无法避免在某个地方投射。
如果你有这个问题,你可能设计的继承层次结构不正确。
【参考方案1】:
好吧,这看起来很荒谬,但问题出在 JSF 代码中:
<ui:repeat var="animal" value="#bean.animals.get('dogs')" varStatus="status">
我不知道为什么,但是将var="animal"
更改为其他任何东西都有效。我不需要任何演员表。
【讨论】:
以上是关于是否可以在没有演员表的情况下从 Animal 列表中获取 Dog 列表?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在没有画布的情况下从 ImageBitMap Web 对象中获取像素?
是否可以在没有原始 .fla 的情况下从 documentClass 文件 (.as) 生成 SWF?
是否可以在没有 async/await 的情况下从 Promise 返回已解析的值?