【发布时间】:2014-03-31 18:40:22
【问题描述】:
刚开始玩,想出了一个甜蜜的方法来为Java Enum toString() method 和this 中的enums 添加功能。
一些进一步的修改让我几乎还添加了一个整洁的(即不抛出异常)反向查找,但有一个问题。它正在报告:
error: valueOf(String) in X cannot implement valueOf(String) in HasValue
public enum X implements PoliteEnum, ReverseLookup {
overriding method is static
有办法吗?
这里的目的是静默添加(通过带有default 方法的接口实现,就像我在链接答案中添加的politeName)一个lookup 方法,该方法执行valueOf 函数而不抛出异常。可能吗?显然现在可以扩展 enum - 迄今为止我使用 Java 的主要问题之一。
这是我失败的尝试:
public interface HasName {
public String name();
}
public interface PoliteEnum extends HasName {
default String politeName() {
return name().replace("_", " ");
}
}
public interface Lookup<P, Q> {
public Q lookup(P p);
}
public interface HasValue {
HasValue valueOf(String name);
}
public interface ReverseLookup extends HasValue, Lookup<String, HasValue> {
@Override
default HasValue lookup(String from) {
try {
return valueOf(from);
} catch (IllegalArgumentException e) {
return null;
}
}
}
public enum X implements PoliteEnum/* NOT ALLOWED :( , ReverseLookup*/ {
A_For_Ism, B_For_Mutton, C_Forth_Highlanders;
}
public void test() {
// Test the politeName
for (X x : X.values()) {
System.out.println(x.politeName());
}
// ToDo: Test lookup
}
【问题讨论】:
-
我的直觉是“添加泛型”。我猜
X.valueOf()必须返回X,所以接口HasValue应该是interface HasValue<TThis>或类似的。请注意,这也意味着您不能进一步创建X的子类,但我又一次不确定这是否可能。 -
@millimoose - 这是我最初的想法 - 遗憾的是,问题是
valueOf是static显然不能被覆盖。我怀疑需要一种完全不同的方法。 -
您要在实例上调用
lookup? -
为了它的价值,我只是将上述功能变成一种实用方法,而不是需要 3-4 个新接口的混乱。
-
@OldCurmudgeon 我和我相信这里的大多数人都关心完成工作,而不是突破界限的“优雅技巧”。至少对我来说,以最少的努力干净地完成工作比无论如何都将这项工作作为实例方法调用更有价值。了解 Java 是一门语言,其设计历来故意避开聪明、高阶编程等。如果您想做“魔术”,不同的平台可能会更好地满足您的需求。