2013-04-04 64 views
1

爲什麼類拋出異常從雙重倍增?類從二倍拋出異常到雙倍

使用,如:

Console.writeLine(Validator.TryParse("1.5", double.class)); 

代碼:

public static <T> T TryParse(Object ConvertFrom, java.lang.Class<T> ConvertTo) { 
     switch(ConvertTo.getSimpleName().toLowerCase()) { 
      case "int": 
      case "integer": return ConvertTo.cast((int)Integer.parseInt((String)ConvertFrom));  
      case "string": return ConvertTo.cast(String.valueOf(ConvertFrom));    
      case "double": return ConvertTo.cast((double)Double.parseDouble((String)ConvertFrom));    
      case "float": return ConvertTo.cast((float)Float.parseFloat((String)ConvertFrom));    
      case "long": return ConvertTo.cast((long)Long.parseLong((String)ConvertFrom));   
      default: return null; 
     } 
    } 
+0

是的,我敢肯定:S你是什麼意思,如果我確定.. C++沒有「對象」..或字符串。 C#是的,但C#是字符串不是字符串。 – Brandon 2013-04-04 00:40:52

+1

@dasblinkenlight我也想知道,但'java.lang.Class '留下了疑問;-) – assylias 2013-04-04 00:40:55

+0

'Console.writeLine'丟掉了我...我認爲它是C#:它允許'string'和' String'。 – dasblinkenlight 2013-04-04 00:41:57

回答

1

你混合基元和盒裝元。調用TryParse("1.5", Double.class)將正常工作(您可以刪除所有不必要的原始類型,例如(int)(double)等)。

你遇到的問題是,Class#cast首先檢查Class#isInstance和:

Double.class.isInstance(1.0); 

是事實,但:

double.class.isInstance(Double.valueOf(1.0)) 
double.class.isInstance(1.0d) 

都是假的如javadoc

解釋的。如果這個類object表示一個原始類型,此方法返回false。

底線:primitive.class.cast()將始終引發異常。

+0

K所以你告訴我一個原始的「盒裝」版本不能轉換爲原始類型?你是認真的嗎? C#允許這個..那麼另一種方式是什麼..爲兩者分別創建一個案例?這樣做沒有意義:S – Brandon 2013-04-04 00:42:06

+0

@CantChooseUsernames:您無法在基元類型上調用'.class'。 – 2013-04-04 00:43:35

+0

@CantChooseUsernames它不能像你這樣做'double.class.cast(Double.valueOf(1.0d));'。 – assylias 2013-04-04 00:43:50

0

應該如下,注意上限爲Double

Console.writeLine(Validator.TryParse("1.5", Double.class)); 
+0

但我需要一個單獨的案例「雙」和「雙」 如果類型不是castable,那麼我該怎麼做: 雙J = 10;雙I = J?這是一個隱含的演員,它的作品。 – Brandon 2013-04-04 00:42:41

0

您可以使用Double.doubleValue()Integer.intValue()

更多閱讀:

除....

你的方法要返回一個對象,所以你不能返回原語。


編輯:

好像你正在試圖做一些事情,這是非常自然的,未爪哇(Java是有原因的類型化的語言)。

1

如果您每次調用驗證器時仍需要定義類,爲什麼不使用每個類的valueOf方法?像Integer和Double這樣的對象類將能夠處理基元和返回對象...

因爲之前有人問過,你確定需要實現這個嗎?您可能想要查看您的設計。

+0

+1爲_review你的(臭)design_ – jahroy 2013-04-04 01:07:13