2014-01-15 87 views
0

我正在嘗試創建以下枚舉。Java中的枚舉類型參數

public enum MyEnum{ 
    LEAD { 
     @Override 
     public boolean isValid(Lead lead) { //compile error, asks to retain type as T 
     } 
    }, 
    TASK { 
     @Override 
     public boolean isValid(Task task) { //compile error, asks to retain type as T 
     } 
    }; 

    public abstract <T extends SObject> boolean isValid(T object); 
} 

LeadTask類都延伸SObject。我的意圖是基本上讓客戶能夠使用MyEnum.LEAD.isValid(lead)MyEnum.TASK.isValid(task)。編譯器不應該允許傳遞其他類型。

有人可以幫助理解爲什麼會發生這種情況。

謝謝

+0

Lead和Task是否有共同的界面?如果不是,則需要使用Object類型來定義方法。 – JustinKSU

+0

@JustinKSU,他們都擴展了'SObject'。 – RandomQuestion

+0

爲什麼在該調用模式中使用'enum'?爲什麼不在「Task」和'Lead'上添加一個靜態方法就像'Lead.isValid(lead)'?甚至是非靜態的,只需調用'lead.isValid()'? –

回答

2

您需要用相同的泛型方法覆蓋泛型方法。如果你想做你在問什麼,你需要一個 - enum不能。

問題的關鍵是,我用類引用參考enum - 即

final MyEnum myenum = MyEnum.LEAD; 

現在,如果我叫myenum.isValid()我應該能夠任何SObject叫它你abstract方法定義。
您擁有的通用方法定義實際上沒有做任何事情。它所做的只是捕獲SObject中傳遞的類型並將其存儲爲T。泛型方法常用來綁在一起類型的參數,例如

<T> void compare(Collection<T> coll, Comparator<T> comparator); 

這裏我們不在乎什麼T實際上是 - 所有我們需要的是,Comparator可以比較是在Collection的事情。

你在想什麼的是一個通用類,類似:

interface MyIface<T> { 
    boolean isValid(T object); 
} 

然後

class LeadValid implements MyIface<Lead> { 
    public boolean isValid(Lead object){} 
} 

你看不同的是,你將有一個MyIface<Lead> - 你必須申報類型MyIface。在enum的情況下,你只有一個MyEnum

+0

感謝您解釋爲什麼它不起作用。我有這些通用類,但想避免創建額外的類,並想到使用我現有的枚舉。 – RandomQuestion