2010-12-16 21 views
4

我正在嘗試編寫一個採用Class<?>的Java函數,並返回一個表示對應的JavaScript類型的合理猜測的字符串。例如輸入/輸出:鑑於類<?>,我可以確定它是否具有特定類型的子類?

in    | out 
--------------------------------- 
String.class  | "string" 
int.class   | "number" 
double.class  | "number" 
Integer.class  | "number" 
Date.class  | "date" (yes, I know that typeof new Date() === 'object') 
boolean.class  | "boolean" 
Foo.class   | "object" 

這裏就是我這麼遠,它似乎主要工作:

String jsType(Class<?> clazz) 
{ 
    if (clazz.equals(String.class) return "string"; 

    if (clazz.equals(boolean.class) return "boolean"; 

    try 
    { 
     clazz.asSubclass(Number.class); 
     return "number"; 
    } 
    catch (Exception e){} 

    try 
    { 
     clazz.asSubclass(Date.class); 
     return "date"; 
    } 
    catch (Exception e){} 

    return "object"; 
} 

然而,這並不正確返回「號碼」號原語,例如int.class,double.class等,儘管它對包裝類型正確工作,Integer.class等。

  • 對於原始類型的類文字是否有特別之處?
  • 有沒有辦法寫這個函數的更好比一堆if-else陳述,對於我感興趣的每一個類?

回答

4

有兩個問題。首先,答案是基本類型的類文字沒有什麼特別之處,除了明顯的:它們代表原始類型。對於這些類型,「isPrimitive()」方法將返回true。你似乎期待原始的「類」類型是0​​的子類,但事實並非如此,正如你的例子所示。

是否有更好的方法來編寫函數,而不是一堆if-else語句?可能不會!儘管我會盡量避免使用異常作爲測試,但應該爲非常特殊的條件保留異常;改爲使用isAssignableFrom(Class<?>) - 儘管我想這更多的是風格(也許效率)。

+0

+1,'isAssignableFrom()'絕對是一個進步。我仍然很想知道_why_ Number.class.isAssignableFrom(int.class)'returns' false' - 這應該是因爲'int'是原始的。 – 2010-12-17 00:24:09

+1

用於提示'isAssignableFrom'。 – 2010-12-17 00:24:47

+0

@Matt int是一個原始類型,不是對象類型層次結構的一部分。因此,它不能超出或低於任何東西(如數字)。 – ILMTitan 2010-12-17 15:37:12

1

下面是第一類正常化,簡化了jsType方法的方法:

Class<?> normalise(Class<?> cls) { 
    if (Number.class.isAssignableFrom(cls) || 
     cls == int.class || cls == long.class || 
     cls == double.class || cls == float.class) { 
     return Number.class; 
    } else if (cls == Boolean.class || cls == boolean.class) { 
     return Boolean.class; 
    } else if (Date.class.isAssignableFrom(cls)) { 
     return Date.class; 
    } else { 
     return cls; 
    } 
} 

String jsType(Class<?> cls) { 
    Class<?> normalised = normalise(cls); 
    if (normalised == Number.class) { 
     return "number"; 
    } else if (normalised == Boolean.class) { 
     return "boolean"; 
    } else if (normalised == Date.class) { 
     return "date"; 
    } else if (normalised == String.class) { 
     return "string"; 
    } else { 
     return "object"; 
    } 
} 
+0

這看起來不錯。你確定我可以在類文字上使用'=='而不是'.equals()'嗎? – 2010-12-17 00:29:52

+0

你當然也可以結合使用這兩種方法。這可能是最簡單的。 – harto 2010-12-17 00:30:48

+1

是的,你可以認爲它可以安全地使用==類的實例。這是規範的一部分,每個Classloader只有一個給定Class對象的實例。 (並且它不會覆蓋默認的equals(),所以這就是你開始的一切。) – Affe 2010-12-17 01:01:31

相關問題