1

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

有人可以告诉我如何使枚举方法起作用吗?此外,如果有人对这些方法有更好的解决方案或疑虑,我将不胜感激。

4

1 回答 1

4

不幸的是enums 不能是通用的。这是因为enum是一个普通的扩展类Enum,即它的定义如下:

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

所以应用程序员不能向这个类添加更多的通用参数。

我可以建议您以下解决方法:

  1. 使您的方法通用,即。将其定义enumpublic <T> getField(Class<T> type). 为每个枚举成员覆盖此方法。然后,您可以在方法的任何调用中提供类型。
  2. 不要将枚举用于此任务。创建具有公共静态成员和私有构造函数的普通类。如果您想要类似枚举的行为,请实现您自己的静态values()valueOf().
于 2014-01-26T15:20:19.480 回答