情境:可能字段是我想觀察的模型的屬性(類似於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中>)
誰能告訴我如何使枚舉的方式工作?此外,如果有人對這些方法有更好的解決方案或擔心,我會很感激聽到它。
謝謝@AlexR。你能提供一個案例1的例子嗎?我不斷收到「方法沒有從它的超類覆蓋方法」的錯誤 – husayt