2012-09-23 52 views
1

我有一對夫婦從一個泛型類型轉換爲另一種方法的類,但我想回到原來的值,如果兩個:參數類型和返回類型是相同的。我能想到的最佳選擇是將參數類型轉換並將其包裝在try catch語句中,但對我來說這似乎很髒。鑄造仿製藥

public WK wrapKey(K key) {... 


public abstract class MyClass<K, V extends Comparable, WK, WV> extends BaseClass<Map<WK, WV>, KeyValueBean<K, V>> { 

... 
public WK wrapKey(K key) { 

    try { 
     return (WK) key; 
    } catch (Exception e) { 
     return null; 
    } 
} 

public WV wrapValue(V value) { 

    try { 
     return (WV) value; 
    } catch (Exception e) { 
     return null; 
    } 
} 

我認爲其他選項可以是指定類類型的構造函數或setter方法參數,然後使用isAssignableFrom:

public WV wrapValue(V value) { 
    if (value.class.isAssignableFrom(this.getWrappedValueClass())){ 
    return WK(V); 
    } 
    return null; 
} 

有沒有其他辦法?

+0

當心類型擦除。 – SLaks

+0

我不認爲這些方法中的任何一種都可以實際工作。我懷疑你太喜歡了。 –

回答

2

Java通過類型擦除實現泛型,這意味着所有類型檢查都在編譯時執行,然後泛型在運行時被擦除。正因爲如此,下面的代碼實際上做什麼都沒有:

public WV wrapValue(V value) { 
    try { 
     return (WV) value; 
    } catch (Exception e) { 
     return null; 
    } 
} 

在運行時,這相當於:

public Object wrapValue(Object value) { 
    return value; 
} 

此方法不會拋出異常,而不是此方法的調用者可能,因爲編譯器會在呼叫站點添加隱式轉換。

你的第二個例子甚至不會編譯,因爲你不能做value.class。你將不得不在類類型都VKV傳遞,如果你想這樣做檢查。

在任何情況下,你的設計似乎過於複雜 - 也許如果你解釋你正在嘗試做的,有可能是一個更好的解決方案。