【发布时间】:2014-01-26 15:11:06
【问题描述】:
情况:可能字段是我想要观察的模型的属性(类似于 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)
第二种(尚未生效)方法: 我现在正在尝试使用枚举类实现相同的行为。我的方法之一是:
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>) 到 (enumer.FieldObserver
)
有人可以告诉我如何使枚举方法起作用吗?此外,如果有人对这些方法有更好的解决方案或疑虑,我将不胜感激。
【问题讨论】:
标签: java generics enums propertychanged