情况:可能字段是我想要观察的模型的属性(类似于 PropertyChangeListener)。字段定义为枚举。我想打电话
someModel.getField(Field f).addObserver(FieldObserver<Something> observer)
观察者的类型(“某事”)取决于字段,我想强制类型安全。例如Field.FIRST_NAME
会采取一个FieldObserver< String>
.
第一种(工作)方法: 我已经可以通过将 Field 定义为具有公共静态最终字段的通用类而不是枚举来实现它。所以我有一个字段,我可以用它来强制类型安全,如下所示:
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)
第二种(尚未工作)方法: 我现在正在尝试使用 enum 类实现相同的行为。我的一种方法是:
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(也是正确的)会给我一个编译时错误,如下所示:
Observable 中的 addObserver (enumer.FieldObserver< capture< ?>>) 无法应用于 (enumer.FieldObserver< java.lang.String>)
有人可以告诉我如何使枚举方法起作用吗?此外,如果有人对这些方法有更好的解决方案或疑虑,我将不胜感激。