2013-06-12 262 views
0

我想知道這是否可能。我創建了一個包含Number的類,該編號可以是FloatInteger.但是,在運行時,這是決定的。動態類型鑄造的Java反射/泛型類型

我想做一個更優雅的函數,可以採用Float或Integer並對其進行數學運算,因爲我確實存儲了變量的類型,所以我希望能夠使用泛型/反射。

這裏是我的枚舉

public enum Type { 

    FLOAT, 
    INTEGER; 

    public final Class clazz; 

    Type() { 
     if (this.name().equals("FLOAT")) 
      clazz = Float.class; 
     else if (this.name().equals("INTEGER")) 
      clazz = Integer.class; 
     else 
      clazz = null; 
    } 
} 

這是內部的上我的課。

下面是一些代碼:

private <T extends Number> T compareTo(Class<T> lhs, Class<T> rhs) { 
    // lhs > rhs return 1 
    // rhs < lhs return -1 
    // else return 0 
} 

現在,我們知道了Java,你不能動態地鍵入像type.clazz lhzType = (type.clazz) lhs鑄件,但有沒有用正確的泛型來完成這件事什麼辦法?我覺得應該有,因爲如果有任何反思問題出現,它可以被視爲一個錯誤。但是到目前爲止,我還沒有像Java那樣先進。

+2

我不知道什麼是你真正想要做的(你有什麼想法爲了比較類,我理解比較類的對象,但比較類型),但似乎你可以通過使用http://pastebin.com/By5Kb1KV – Pshemo

+2

改善一點你的枚舉我很困惑 - 爲什麼'compareTo'採取'Class '而不是'T's? –

回答

3

我不明白你正在試圖完成的任務,但我可以告訴你如何實現你已經發布的代碼片段:

首先,您應枚舉傳遞(界)類到構造函數:

public enum Type { 

    FLOAT(Float.class), 
    INTEGER(Integer.class); 

    private final Class<T extends Number & Comparable<T>> clazz; 

    Type(Class<T extends Number & Comparable<T>> clazz) { 
     this.clazz = clazz; 
    } 
} 

請注意,我不知道你會怎麼做這個類。

其次,你的方法需要的方法來聲明傳入的對象的類型,你不需要指一類類型的枚舉和方法並沒有真正與枚舉有任何關係。它可以是一個靜態實用方法,把任何地方:

public static <T extends Number & Comparable<T>> int compareTo(T lhs, T rhs) { 
    return lhs.compareTo(rhs); 
} 

這裏的關鍵是約束雙方NumberComparable<T>,因爲雖然所有Number子類實現compareTo(),在Number類做定義它。


一個類型一樣的參數,你可以使用反射,這樣的事情:

// Coded for brevity rather than "best practice" 
public static <T extends Number & Comparable<T>> T compareTo(Class<T> clazz, T lhs, T rhs) throws Exception { 
    String s = "some string that represents the value of the new Numner"; 
    T t = clazz.getConstructor(String.class).newInstance(s); 
    return t; 
} 
+0

好的,但還有一件事。如果我想創建一個新的數字,比如說一個基於枚舉類型的Float,我該如何聲明它? 我在最後一段提到了這個問題,但我也應該把它作爲我的問題的一個要點。 –

+0

基本上,我認爲你的枚舉應該是*操作*,而不是*類型*。宣佈這樣的類型是非常不尋常的。也許你應該在你想如何使用你的枚舉的問題中顯示一些代碼 - 即使代碼不能編譯 - 所以我們可以理解你的想法的意圖。 – Bohemian

+0

請參閱編輯答案,以獲取返回類型的一種可能實現。 'clazz'可能是你的enum中的clazz,而tan則通過它。 – Bohemian