2014-09-19 84 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; 
}  

//... 
}