Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举方法的泛型返回类型_Java_Generics_Enums_Propertychanged - Fatal编程技术网

Java 枚举方法的泛型返回类型

Java 枚举方法的泛型返回类型,java,generics,enums,propertychanged,Java,Generics,Enums,Propertychanged,情况:字段可能是我想要观察的模型的属性(类似于PropertyChangeListener)。字段定义为枚举。我想打电话 someModel.getField(Field f).addObserver(FieldObserver<Something> observer) 使用Observable中的方法时:void addObserver(FieldObserver>)无法应用Observable中的方法 到(enumer.FieldObserver) 有人能告诉我如何使枚举方法工

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

someModel.getField(Field f).addObserver(FieldObserver<Something> observer)
使用
Observable
中的方法时:
void addObserver(FieldObserver>)无法应用Observable中的方法
到(enumer.FieldObserver


有人能告诉我如何使枚举方法工作吗?此外,如果有人对这些方法有更好的解决方案或顾虑,我将非常感谢听到。

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

类MyEnum扩展了枚举{}

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

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

  • 使您的方法通用,即在
    enum
    级别将其定义为
    public getField(类类型)
    。为每个枚举成员重写此方法。然后可以在方法的任何调用中提供类型
  • 不要对此任务使用枚举。创建具有公共静态成员和私有构造函数的普通类。如果希望类似枚举的行为,请实现自己的静态
    values()
    valueOf()

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

    类MyEnum扩展了枚举{}

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

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

  • 使您的方法通用,即在
    enum
    级别将其定义为
    public getField(类类型)
    。为每个枚举成员重写此方法。然后可以在方法的任何调用中提供类型
  • 不要对此任务使用枚举。创建具有公共静态成员和私有构造函数的普通类。如果希望类似枚举的行为,请实现自己的静态
    values()
    valueOf()

    谢谢@AlexR。你能为案例1提供一个例子吗?我不断得到“Method不会从它的超类重写Method”errorThank@AlexR。你能为案例1提供一个例子吗?我不断得到“方法不从它的超类重写方法”错误
    public <E> Observable<E> getField(Field<? extends E> f)
    
    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();
     }