Enum常量在Java中实现通用接口

时间:2012-11-03 07:27:52

标签: java generics interface enums

假设您有一个通用接口:

public interface MyInterface<T> {
    T doSomething();
}

是否可以声明一个实现MyInterface<T>的枚举,但是每个枚举常量为其实现T的不同值?也就是说,鉴于此枚举:

public enum MyEnum {
    FOO,
    BAR,
    BAZ;
}

我们可以更改它,以便FOO实现MyInterface<Integer>BAR实现MyInterface<String>BAZ实现MyInterface<List<MyOtherType>>,并使其成为MyEnum整体实施MyInterface<?>?这样做是完全可行的,所以它可能是以类型安全的方式完成的。

2 个答案:

答案 0 :(得分:9)

不,作为amalloy pointed out,Java不允许使用类型参数声明枚举。很明显,如果你考虑使用枚举的方式,例如在switch中。

还要考虑语言如何实现通用枚举 - 这不是一件容易的事。对于通用枚举MyEnum<T>,每个枚举常量需要将T解析为某种特定类型,否则它们根本不会是常量。考虑一下:

enum MyEnum<T> {
    FOO; // T is not resolved
}

这里T的{​​{1}}是什么?语言需要一种新的语法才能表达它,例如:

FOO

所以现在我们为语言增加了复杂性,以支持没有过于引人注目的用例的语义。很容易理解为什么语言设计者会简单地为枚举添加类型参数。

解决方法:

您可以通过简单地不使用枚举来模拟您想要的模式。将接口的实现组织到实用程序类中:

enum MyEnum<T> {
    FOO<String>;
}

唯一遗漏的是一种迭代不同实现的方法,就像你可以使用public class MyImplementations { public static final MyInterface<Integer> FOO = new MyInterface<Integer>() { ... }; public static final MyInterface<String> BAR = new MyInterface<String>() { ... }; public static final MyInterface<List<MyOtherType>> BAZ = new MyInterface<List<MyOtherType>>() { ... }; private MyImplementations() { } } 一样 - 但假设MyEnum.values(),你可以迭代的最具体的类型是MyEnum<T>

答案 1 :(得分:4)

没有。怎么会有人使用这样的课程?

MyEnum x = whatever;
x.foo().get(0); // how can javac know that x is the version that gives back a List?