2014-01-26 148 views
1

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

谁能告诉我如何使枚举的方式工作?此外,如果有人对这些方法有更好的解决方案或担心,我会很感激听到它。

回答

3

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

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

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

我可以建议你如下变通:

  1. 让你的方法通用的,也就是说。将其定义为enum级别为public <T> getField(Class<T> type)。为每个枚举成员重写此方法。然后,您可以在任何方法调用时提供该类型。
  2. 请勿使用枚举来完成此任务。使用公共静态成员和私有构造函数创建普通类。如果你想让枚举类行为实现你自己的静态values()valueOf()
+0

谢谢@AlexR。你能提供一个案例1的例子吗?我不断收到“方法没有从它的超类覆盖方法”的错误 – husayt