2014-01-26 147 views
1

情境:可能字段是我想觀察的模型的屬性(類似於PropertyChangeListener)。字段被定義爲Enum。我想致電enum方法的通用返回類型

someModel.getField(Field f).addObserver(FieldObserver<Something> observer) 

觀察者的類型(「某事」)取決於該字段,我想強制類型安全。例如Field.FIRST_NAME將採取FieldObserver< String>

優先(工作)的辦法: 我已經可以通過定義字段作爲公共靜態最終字段泛型類達到的,而不是枚舉它。所以我有一個領域,我可以使用強制類型安全這樣的:

public <E> Observable<E> getField(Field<? extends E> f) 

與方法Observable<E>void addObserver(FieldObserver<? super E> observer)

現在下面一行將導致編譯時錯誤,這就是我想要的

someModel.getField(Field.some_STRING_field).addObserver(INTEGERObserver) 

二(還沒有成型)的方法: 現在我想實現相同的行爲與枚舉類。我的一個辦法是:

public enum Field{ 
FIRST_NAME("firstName") { 
     @Override 
     public Observable<String> getObservable() { 
      return new Observable<String>(); 
     } 
    },... 

    //every Field must implement: 
    public abstract FieldObservable.Observable<?> getObservable();` 
} 

//getField(Field f) of the Model-class: 
public Observable<?> getField(Field f){ 
    return f.getObservable(); 
} 

嘗試添加任何類型(也是正確的)的FieldObserver給了我這樣一個編譯時錯誤:

的addObserver(enumer.FieldObserver <捕獲< ?>>)可觀察不能應用於 到(enumer.FieldObserver < java.lang.String中>)

誰能告訴我如何使枚舉的方式工作?此外,如果有人對這些方法有更好的解決方案或擔心,我會很感激聽到它。

回答

3

不幸的是enum s不能通用。這是因爲enum是擴展Enum一個普通的類,即其定義如下所示:

class MyEnum<E extends Enum<E>> extends Enum<E extends Enum> {}

所以應用程序員不能更通用的參數添加到這個類。

我可以建議你如下變通:

  1. 讓你的方法通用的,也就是說。將其定義爲enum級別爲public <T> getField(Class<T> type)。爲每個枚舉成員重寫此方法。然後,您可以在任何方法調用時提供該類型。
  2. 請勿使用枚舉來完成此任務。使用公共靜態成員和私有構造函數創建普通類。如果你想讓枚舉類行爲實現你自己的靜態values()valueOf()
+0

謝謝@AlexR。你能提供一個案例1的例子嗎?我不斷收到「方法沒有從它的超類覆蓋方法」的錯誤 – husayt