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"

Map<String, Rarity>これは、設計上、aなどではなくとして扱われList<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 に答える