我有一个类似的枚举:
enum TEST {
TEST1, TEST 2;
public abstract <T> String stringify (T input);
}
我需要添加一个常量特定的方法,比如stringify。
此方法将采用不同类型的输入(对于每个枚举)。我能这样做吗? Eclipse不允许我这样做..像:
enum TEST {
TEST1(
public <Float> String stringify (Float input){
return String.valueOf(input);
}
)
}
答案 0 :(得分:3)
您无法使用enum
执行此操作,但您可以使用泛型类来模拟此行为:
public abstract class TEST<T> {
public static final TEST<Float> TEST1 = new TEST<Float>() {
public String stringify (Float input){
return String.valueOf(input);
}
};
public abstract <T> String stringify(T input);
}
答案 1 :(得分:2)
enum TEST {
TEST1 {
public <Float>String stringify(Float input) {
System.out.println("TEST1");
return String.valueOf(input);
}
},
TEST2 {
public <Integer>String stringify(Integer input) {
System.out.println("TEST2");
return String.valueOf(input);
}
},
TEST3 {};
public <T>String stringify(T input) {
System.out.println("super");
return "";
}
public <Integer>String stringify2(Object input) {
System.out.println("non generic");
return String.valueOf(input);
}
}
public class Main{
public static void main(String[] args) {
for(TEST test:TEST.values()) {
System.out.println(test.stringify(new Float(1.23)));
System.out.println(test.stringify(new Integer(42)));
System.out.println(test.stringify(new Double(4.56)));
}
for(TEST test:TEST.values()) {
System.out.println(test.stringify2(new Float(1.23)));
System.out.println(test.stringify2(new Integer(42)));
System.out.println(test.stringify2(new Double(4.56)));
}
}
}
答案 2 :(得分:0)
将每个Enum值视为一个类。所以,是的,枚举可以有方法,就像类一样 - 它们都有相同的方法。
http://download.oracle.com/javase/tutorial/java/javaOO/enum.html
看看Planet的例子。
另请注意,枚举本身可以有静态方法....(就像一个类)
答案 3 :(得分:0)
不,你不能让每个枚举常量实现一个抽象方法,但需要一个不同于其他枚举常量的输入类型。如果可以的话,如果您获得了TEST
枚举的实例(您不知道它是什么常量)并尝试在其上调用stringify
,会发生什么?你会通过什么类型的?
编辑:鉴于您对用于将字符串解码为对象的这些枚举所说的话,在我看来,您有几种选择:
String
即可获得每个已解码对象的toString()
个表示。stringify(Float)
和stringify(Double)
等。然后您可以调用TEST.stringify(value)
并且如果有stringify
1}}值的类型的方法,它工作正常。我想还有其他选择。
答案 4 :(得分:0)
你不能在枚举中使用泛型,因为枚举常量本身已经是具体(单例)实例。在实例层面,泛型必须已具体化 所以,我会建议选择其他答案中给出的替代方案之一。
如果必须在枚举中执行此操作,则可以考虑以下内容,这至少为您提供了类型检查的运行时方法,包括ClassCastExceptions。但是你不会得到编译器的任何支持。
public enum TestEnum {
Test1(Float.class),
Test2(Integer.class),
Test3(String.class);
private final Class<?> iInputType;
private TestEnum(final Class<?> pInputType) {
iInputType = pInputType;
}
public Class<?> getInputType() {
return iInputType;
}
public String stringify(final Object pInput) {
return String.valueOf(iInputType.cast(pInput));
}
}
测试代码:
System.out.println(TestEnum.Test1.stringify(1.23f));
System.out.println(TestEnum.Test2.stringify(42));
System.out.println(TestEnum.Test3.stringify("foo"));
// but:
// System.out.println(TestEnum.Test1.stringify("foo")); // -> ClassCastException!
for (TestEnum test : TestEnum.values()) {
for (Object input : new Object[]{1.23f, 42, "foo"}) {
if (test.getInputType().isAssignableFrom(input.getClass())) {
System.out.println(test.stringify(input));
}
}
}