gpt4 book ai didi

java - 枚举方法的通用返回类型

转载 作者:行者123 更新时间:2023-11-29 05:30:11 24 4
gpt4 key购买 nike

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

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

Observer 的类型(“Something”)取决于 Field,我想强制类型安全。例如Field.FIRST_NAME需要 FieldObserver< String> .

第一种(可行的)方法:我已经可以通过将 Field 定义为具有公共(public)静态最终字段而不是枚举的通用类来实现它。所以我有一个 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 都会给我这样的编译时错误:

addObserver (enumer.FieldObserver< capture< ?>>) in Observable cannot be applied to (enumer.FieldObserver< java.lang.String>)

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

最佳答案

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

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

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

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

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

关于java - 枚举方法的通用返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21365058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com