情境:可能字段是我想观察的模型的属性(类似于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