【问题标题】:Is it possible to get a list of Dog from a list of Animal without a cast?是否可以在没有演员表的情况下从 Animal 列表中获取 Dog 列表?
【发布时间】: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; 检索您的狗列表,您将不得不强制转换它。你无法避免在某个地方投射。
  • 如果你有这个问题,你可能设计的继承层次结构不正确。

标签: java jsf jsf-2 java-7 el


【解决方案1】:

好吧,这看起来很荒谬,但问题出在 JSF 代码中:

<ui:repeat var="animal" value="#{bean.animals.get('dogs')}" varStatus="status">

我不知道为什么,但是将var="animal" 更改为其他任何东西都有效。我不需要任何演员表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-03
    • 2021-07-05
    • 2016-11-06
    • 2022-01-15
    • 1970-01-01
    • 2017-05-25
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多