3

我有这个签名的通用类:

public abstract class EnumListBean<E extends Enum<E>> {

    public List<E> getEnumList() {
        //implementation details
    }

}

目前,我必须定义一个空子类才能访问具体泛型参数的 enumList 属性:

@ManagedBean
@ApplicationScoped
public class ItemRarityBean  extends EnumListBean<Item.Rarity>{
}

这使得访问该属性成为可能,例如:

<f:selectItems value="#{itemRarityBean.enumList}" var="rarity"
            itemLabel="#{rarity.readableName}" itemValue="#{rarity}" />

我想知道是否真的必须声明一个派生 bean 但不能直接将泛型类作为 bean 访问:

<f:selectItems value="#{enumListBean<Item.Rarity>.enumList}" var="rarity"
                itemLabel="#{rarity.readableName}" itemValue="#{rarity}" />
4

2 回答 2

4

您不能在 EL 中使用泛型。EL 是一种基于反射的运行时语言。你知道,泛型只在编译时可用,在运行时不可用。

对于您的特定目的,使用OmniFaces <o:importConstants>可能更容易。

<o:importConstants type="com.example.Item$Rarity" var="Rarity" />
...
<h:selectOneMenu>
    <f:selectItems value="#{Rarity}" />
</h:selectOneMenu>

(该var属性不是强制性的,但您需要引用它,因为#{Item$Rarity}它不完全可读;如果您的Rarity枚举是独立枚举而不是内部枚举,那么您可以使用type="com.example.Rarity"

它在设计上被视为 a Map<String, Rarity>,而不是 aList<Rarity>左右。因此,如果您打算访问 的var属性中的各个项目<f:selectItems>,以便您可以访问特定的枚举方法,那么您需要显式迭代Map#values()(这需要 EL 2.2 支持)。

<h:selectOneMenu>
    <f:selectItems value="#{Rarity.values()}" var="rarity" itemValue="#{rarity}" itemLabel="#{rarity.readableName}" />
</h:selectOneMenu>
于 2012-07-17T19:32:28.010 回答
2

是的,你必须。因为实例化抽象类没有意义。

于 2012-07-17T18:59:43.387 回答