2011-12-04 75 views
0

我想將我的一些方法重構爲一種基於方法參數將字符串值轉換爲int/float的方法。對於這件事情我已創建像下面的方法:如何將通用數據類型傳遞給方法以及如何創建使用它的propper方法?

private <T>Number setNumericValue(String value , T type) 
{ 

    value = value.trim(); 
    if(isNumeric(value)) 
    { 
     if (type instanceof Integer) 
      return Integer.parseInt(value); 
     if (type instanceof Float) 
      return Float.parseFloat(value); 

    } 
    return 0; 
} 

首先,我想知道的是我的方法正確嗎? 和調用這個方法我該如何使用它?我創建了這樣的事情但Java給我運行時錯誤

this.temperatureC = setNumericValue(temperatureC, Float); 

的錯誤說:「無法施放浮動到T」如果你相應地改變你的方法來簽名(及實施

+2

**你得到了什麼錯誤?** – SLaks

+0

你不需要你自己的'isNumeric()'函數。 'parseInt()','parseFloat()',並且這樣會拋出一個'NumberFormatException',捕獲它返回一個默認值。 – millimoose

回答

1

你需要返回相應類型的默認值太大:

private <T extends Number> T setNumericValue(String value, Class<T> type) { 
    value = value.trim(); 
    if (isNumeric(value)) { 
     if (type.isAssignableFrom(Float.class)) 
      return type.cast(Float.parseFloat(value)); 
     if (type.isAssignableFrom(Integer.class)) 
      return type.cast(Integer.parseInt(value)); 
    } else { 
     if (type.isAssignableFrom(Float.class)) 
      return type.cast(Float.valueOf(0)); 
     if (type.isAssignableFrom(Integer.class)) 
      return type.cast(Integer.valueOf(0)); 
    } 

    throw new IllegalArgumentException(String.format(
      "Cannot convert '%s' to %s", value, type.getSimpleName() 
    )); 
} 

您的原始結構沒有類型安全的,你可以不投原始值T extends Number。 Java的原始類型包裝器也不支持使用Class.cast在不同數字類型之間轉換,所以您必須明確地執行此操作。

2

private <T extends Number> T setNumericValue(String value, Class<T> classType) 

你可以用

this.temperatureC = setNumericValue(temperatureC, Float.class) 
3

調用它你可以這樣做:

private <T extends Number> T setNumericValue(String value , Class<T> type) 
{ 

    value = value.trim(); 
    if(isNumeric(value)) 
    { 
     if (type.isAssignableFrom(Float.class)) 
      return type.cast(Float.valueOf(value)); 
     if (type.isAssignableFrom(Integer.class)) 
      return type.cast(Integer.valueOf(value)); 
    } 
    return type.getConstructor(String.class).newInstance("0"); 
} 
this.temperatureC = setNumericValue(temperatureC, Float.class); 
+0

改變我的返回值後,你和羅賓說我會得到錯誤返回類型在JRE 1.7錯誤「不能轉換從int到T」 –

+0

@austinpowers該錯誤不會發生此代碼示例。如果您使用他人的建議,但它不起作用,請使用您的代碼編輯您的帖子,並指出發生新錯誤的位置,而不是讓其他人追溯所有各種答案和評論以嘗試找出您的「再指。 – millimoose

+0

@austinpowers好吧,我有正確的答案。我添加了「type.cast()」和valueOf以進行正確賦值,併爲默認值添加了「type.cast(Integer.valueOf(0))」(對於defaut值可能有更好的解決方案)。 –

相關問題