2013-08-19 87 views
2

下面是代碼片段。在通用類中鑄造

public class Operand<T> { 

    private OperandStore store; 

    private final int operandType, operandId; 

    public Operand(int operandType, int operandId, OperandStore store) { 
     this.operandId = operandId; 
     this.operandType = operandType; 
     this.store = store; 
    } 

    @SuppressWarnings("unchecked") 
    public T evaluate() { 
     try { 
      return (T) store.getValue(operandType, operandId); 
     } 
     catch (Exception e) { 
      return null; 
     } 
    } 
} 

getValue方法:

public Object getValue(int operandType, int operandId) { 
     // return some value from a <String, Object> hashmap based on some condition 
    } 

當我創建上面的類的對象,像這樣:

Operand<Integer> obj = new Operand<>(1,1,store); 

...並確保store.getValue(operandType, operandId)返回一個字符串,我期望在try塊中發生錯誤,但這不會發生。它將返回string的值。

任何理由?請解釋一下。謝謝。

+0

你可以顯示'OperandStore.getValue()'方法嗎?實際上也是類聲明。 –

+0

更新了代碼。這會有幫助嗎?謝謝。 – LPD

+0

你需要展示如何在OperandStore中填充'HashMap'?你是如何創建「OperandStore」的?如果您可以發佈類定義,並且在此使用所有相關的方法,這將會很有幫助。 –

回答

3

你簡單地調用obj.evaluate()或者你調用像Integer x = obj.evaluate()

例如:

OperandStore store = new OperandStore(); 
Operand<Integer> obj = new Operand<>(1,1,store); 
Integer x = obj.evaluate(); 

這將失敗,並ClassCastException,因爲它的存在,其中的Java實現的問題。

在此之前它不會因type erasure而失敗。基本上,運行時的T類型只是java.lang.Object,這就是爲什麼T的任何東西似乎都可以工作,但是一旦嘗試在您的調用站點中使用T,您將在Java嘗試執行時遇到異常合成鑄件。

3

刪除@SuppressWarnings("unchecked"),並閱讀警告。

它告訴你「未經檢查的cast:'java.lang.Object'to T」。

未經檢查的轉換意味着:「轉換不會檢查該對象是否爲T.」。

所以你已經被編譯器警告過,這不起作用,但忽略了警告。由於類型擦除它不起作用。