我正在尝试一个来自" Effective Java "项目34的示例代码片段。我用jdk1.8 win10。
package mygroup;
import java.util.*;
public class ExtendsEnum {
private static enum Operation {
Plus,
Minus;
}
public static <T extends Enum<T> & Operation> // error
void testEnumClass(Class<T> opSet) {
for (Operation op : opSet.getEnumConstants()) {
System.out.println(op);
}
}
public static void main(String[] args) {
ExtendsEnum.testEnumClass(Operation.class);
}
}
编译器说:需要接口类型。我不确定问题行上的程序在jdk1.8中是否仍然有效,我只是试图从书中的示例代码复制。jdk是否识别:
<T extends Enum<T> & Operation>
如果没有,如何修复?
中使用&
时通用的界限,只有第一部分可能是一个类。其他一切都必须是接口。Operation
不是接口,这就是它失败的原因。
但是你的例子没有意义。只有一种类型与T extends Enum<T> & Operation
匹配,那就是Operation
本身。为什么要使用泛型类型呢?
以下是可能的(是的,OperationEnum
是个糟糕的名字):
interface Operation { /* some methods */ }
enum OperationEnum implements Operation { /* constants, methods from Operation */ }
但是,除非您定义了一个接口,该接口实际上添加了不在枚举中的方法(如name()
和ordinal()
),否则没有必要使用比T extends Enum<T>
更强的绑定。