如何在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支持) )。
是的,你必须。 因为实例化抽象类没有意义。