2014-09-19 34 views
0

我会枚举返回一个接口的实例,使用泛型。我无法弄清楚。我不确定如何说出我的问题。下面是我想要工作的代码。它不会编译,因为枚举需要构造函数来处理ImplementingClass的明确性。Enum使用Java中的泛型返回接口的实例?

我的界面

pubic interface MyInterface { 

} 

我的实现类

public class ImplementingClass implements MyInterface { 

} 

我试图枚举得到工作

public enum MyEnum { 

    CASE1(“CODE1”, ImplementingClass.class); 

    private String code; 
    private Class<MyInterface> aClass; 

    private MyEnum(String code, Class<MyInterface> aClass) { 
     this.code = code; 
     this.aClass = aClass; 
    }  

    public String getCode() { 
     return this.code; 
    } 

    public MyInterface getInstance() { 
     return this.aClass.newInstance(); 
    } 
} 
+0

您没有正确使用枚举...除非您让MyEnum成为类 – ControlAltDel 2014-09-19 16:03:13

回答

2

是一个Class<MyInterface>只能MyInterface.class的问题,而不是任何实施类,如ImplementingClass.class

您可以使用通配符来对aClass申报创建的上限采取Class对象,表示实现任何类MyInterface

private Class<? extends MyInterface> aClass; 

private MyEnum(String code, Class<? extends MyInterface> aClass) { 
    this.code = code; 
    this.aClass = aClass; 
} 
+0

好了,谢谢。有没有什么办法可以实例化这个类而不抛出InstantiationException和IllegalAccessExceptions?或者一个更好的方法来解决这个问题? – user3349673 2014-09-19 16:11:57

+0

不,如果你有一个'Class'对象,并且你想要一个该类的实例,那么就没有办法捕捉这些异常或者必须在方法中用'throws'子句声明它们。 – rgettman 2014-09-19 16:16:05

0

一些使用通配符和铸造的做魔术:

public enum MyEnum { 

CASE1("CODE1", (Class<? extends MyInterface>)ImplementingClass.class); 

private String code; 
private Class<? extends MyInterface> aClass; 

private MyEnum(String code, Class<? extends MyInterface> aClass) { 
    this.code = code; 
    this.aClass = aClass; 
}  

//... 
}