如何在f:selectItems中为枚举创建和使用通用bean?

我有这个签名的generics类:

public abstract class EnumListBean<E extends Enum> { public List getEnumList() { //implementation details } } 

目前,我必须定义一个空子类,以便访问具体generics参数的enumList属性:

 @ManagedBean @ApplicationScoped public class ItemRarityBean extends EnumListBean{ } 

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

  

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

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

你不能在EL中使用generics。 EL是一种基于reflection的运行时语言。 您知道,generics仅在编译期间可用,而不是在运行时期间。

出于特定目的,使用OmniFaces 可能更容易。

  ...    

var属性不是必需的,但你需要引用它作为#{Item$Rarity} ,它不是很好读;如果你的Rarity枚举是一个独立的枚举而不是内部枚举,那么你可以使用type="com.example.Rarity"

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

    

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