是否可以在没有演员表的情况下从 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>());

一切正常,正如预期的那样。如果我想要DogCat,我只需要从地图中获取并投射即可。

但是,如果我想要呢

animals.put("dogs", new ArrayList<Dog>());

Java 不允许我这样做。我也在this SO answers 中读到了它,但我需要它,因为我使用的是 JSF,并且我需要在页面的 EL 表达式中使用 Animal 没有的 Dog 方法。

自从我为Animal 创建了一个工厂后,我想使用工厂来获取正确的对象类型,但我觉得有点奇怪。

有什么方法可以使用animals.put("dogs", new ArrayList&lt;Dog&gt;()); 或其他替代方法吗?

PS:我使用的是 Java 7

【问题讨论】:

好吧,您可以使用Map&lt;String, List&lt;? extends Animal&gt;&gt; animals;,这将允许您执行animals.put("dogs", new ArrayList&lt;Dog&gt;());,但您仍然无法在不强制转换的情况下从该地图中获得ArrayList&lt;Dog&gt;。毕竟,映射可以包含其他键的其他类型,那么编译器怎么知道要在这里返回什么类型呢?您需要提供该演员表,可能使用 List&lt;Dog&gt; getDogs() return (List)animals.get("dogs"); 之类的特定方法(原始演员表是必要的,因此编译器不会抱怨。 地图的泛型支持所有相同类型的值,并且您有一个地图,其中值的类型略有不同。听起来您应该使用Map&lt;String, List&lt;? extends Animal&gt;&gt;,但如果您想以List&lt;Dog&gt; 而不是List&lt;? extends Animal&gt; 检索您的狗列表,您将不得不强制转换它。你无法避免在某个地方投射。 如果你有这个问题,你可能设计的继承层次结构不正确。 【参考方案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 返回已解析的值?

是否可以在没有我的服务器的情况下从 Android 应用程序付款?

如何在不阻塞的情况下从 Flux 获取列表?

如何在没有 Linq 的情况下从列表中获取一些对象?