2012-07-17 68 views
3

我有通用類與此簽名:如何在f:selectItems中爲枚舉創建和使用泛型bean?

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

你會發現[OmniFaces'<○:importConstants>'](https://showcase-omnifaces.rhcloud.com/showcase/taghandlers/importConstants.xhtml)是有用的。 – BalusC 2012-07-17 19:03:52

+0

在您的具體情況下,即使EL可以訪問具體的參數化類型,它也可能不會有用。由於類型擦除,'new EnumListBean .getEnumList()'不返回除'new EnumListBean .getEnumList()'以外的任何內容,而不傳遞類型標記。你可以做的是僞造一個索引屬性,並且有一個可以通過'Class'索引的bean,該類返回它的值列表,但我不確定是否可以在EL中使用類文字。 – millimoose 2012-07-17 19:07:30

+0

@BalusC哇,幾乎是我想要達到的確切的東西。一個''輸入的枚舉是否可以和''一起用作列表? – Paranaix 2012-07-17 19:12:13

回答

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>左右。因此,如果您打算訪問屬性<f:selectItems>中的單個項目,以便您可以訪問特定的枚舉方法,那麼您需要明確地重複執行Map#values()(這將需要EL 2.2支持)。

<h:selectOneMenu> 
    <f:selectItems value="#{Rarity.values()}" var="rarity" itemValue="#{rarity}" itemLabel="#{rarity.readableName}" /> 
</h:selectOneMenu> 
2

是的,你必須。因爲實例化抽象類是沒有意義的。

+1

這個類在當前用例中只是抽象的。我可以自由改變宣言。 – Paranaix 2012-07-17 19:06:43