我有这个签名的通用类:
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}" />
答案 0 :(得分: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>
,而不是List<Rarity>
左右。因此,如果您打算访问var
的{{1}}属性中的各个项目,以便您可以访问特定的枚举方法,那么您需要显式迭代<f:selectItems>
(这将需要EL 2.2支持。)
Map#values()
答案 1 :(得分:2)
是的,你必须这样做。因为实例化抽象类是没有意义的。