gpt4 book ai didi

java - 在枚举 : this static method cannot hide the instance method from interface 之间实现相同的行为

转载 作者:行者123 更新时间:2023-12-02 09:17:53 26 4
gpt4 key购买 nike

我有一个通用流程,具有不同的进度值和步骤数,具体取决于用户。

为了解决这个问题,我制作了一个界面:

public interface Progress {
int getTotalStepNumber();
int getIndex();
String getMessage();
@Override
String toString();
}

所以一个步骤流程的实现是这样的,简单地说,它是这个流程的步骤的枚举:

public enum ProgressImplementationOfProcessOne implements Progress {

STEP_ONE(1, "Step one message."),
STEP_TWO(2, "Step two message.");
// ... etc. with more steps

/**
* Number of steps for this process.
*/
private static final int STEPS = 2;

private int index;
private String message;

ProgressImplementationOfProcessOne(int index, String message) {
this.index = index;
this.message = message;
}

@Override
public int getTotalStepNumber() { return STEPS; }

@Override
public int getIndex() { return this.index; }

@Override
public String getMessage() { return this.message; }

@Override
public String toString() { return this.message; }
}

但后来我想,使用枚举的 valueOf() 方法从实现中找到相应的步骤也很好。所以我在界面中添加了以下几行:

default Progress valueOf(String s) {
for (Progress progress : this.getValues()) {
if (progress.getMessage().equals(s)) {
return progress
}
}
return null;
}
default Progress valueOf(int i) {
for (Progress progress : this.getValues()) {
if (progress.getIndex() == this.getIndex()) {
return progress;
}
}
return null;
}

由于接口(interface) Progress 中没有 getValues() 方法,我向其中添加了以下方法(认为“枚举实现将在 native 处理它”)。

default List<Progress> getValues() { return null; }

但我不明白为什么每个 ProgressImplementation 都会出现此错误:此静态方法无法从 Progress 中隐藏实例方法。

我知道我可以通过创建一个额外的 class ProgressStep 来实现这一点,它替换枚举值,并用具有属性的类替换枚举等,但由于枚举可以处理多个值,我认为它可以使用它变得更容易。

最佳答案

只需将 valueOf 重命名为 valueOfEnum 之类的名称,因为 valueOf 已由 java.lang.Enum 指定>.

public static <T extends Enum<T>> T valueOf(Class<T> enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}

对该方法的注释包含以下部分:

Note that for a particular enum type T, the implicitly declared public static T valueOf(String) method on that enum may be used instead of this method to mapfrom a name to the corresponding enum constant. All theconstants of an enum type can be obtained by calling the implicit public static T[] values() method of that type

强调我的

如您所见,valueOf(String s) 已在每个枚举类上声明,这反过来就是原因,您不能将它放在任何枚举的接口(interface)中

关于java - 在枚举 : this static method cannot hide the instance method from interface 之间实现相同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58878060/

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