我正在尝试编写一个带有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
等。
答案 0 :(得分:4)
有两个问题。首先,答案是原始类型的类文字没有什么特别之处,除了显而易见的:它们代表原始类型。对于此类类型,“isPrimitive()”方法将返回true。您似乎期望原始的“类”类型是Number
的子类,但事实并非如此,正如您的示例所示。
有没有更好的方法来编写函数而不是一堆if-else语句?可能不是!虽然我会尽量避免使用异常作为测试,但应该保留例外以用于真正特殊的条件;使用isAssignableFrom(Class<?>)
代替 - 虽然我猜这更像是一种风格(也许是效率)。
答案 1 :(得分: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";
}
}