【问题标题】:Generic return type of enum-method枚举方法的通用返回类型
【发布时间】:2014-01-26 15:11:06
【问题描述】:

情况:可能字段是我想要观察的模型的属性(类似于 PropertyChangeListener)。字段定义为枚举。我想打电话

someModel.getField(Field f).addObserver(FieldObserver<Something> observer)

观察者的类型(“某事”)取决于字段,我想强制类型安全。例如Field.FIRST_NAME 将采用FieldObserver&lt; String&gt;

第一种(可行的)方法: 我已经可以通过将 Field 定义为具有公共静态最终字段的通用类而不是枚举来实现它。所以我有一个字段,我可以用它来强制类型安全:

public <E> Observable<E> getField(Field<? extends E> f)

使用Observable&lt;E&gt;中的方法:void addObserver(FieldObserver&lt;? super E&gt; 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


    【解决方案1】:

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

    class MyEnum&lt;E extends Enum&lt;E&gt;&gt; extends Enum&lt;E extends Enum&gt; {}

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

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

    1. 使您的方法通用,即。在enum 级别中将其定义为public &lt;T&gt; getField(Class&lt;T&gt; type)。为每个枚举成员覆盖此方法。然后,您可以在方法的任何调用中提供类型。
    2. 请勿在此任务中使用枚举。创建具有公共静态成员和私有构造函数的普通类。如果您想要类似枚举的行为,请实现您自己的静态values()valueOf()

    【讨论】:

    • 感谢@AlexR。你能提供一个案例1的例子吗?我不断收到“方法不会覆盖超类中的方法”错误
    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多