给定一个Class <! - ? - >,我可以确定它是否是特定类型的子类吗?

时间:2010-12-16 23:50:28

标签: java

我正在尝试编写一个带有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.classdouble.class等,虽然它对包装类型有效,Integer.class等。

  • 原始类型的类文字有什么特别之处吗?
  • 对于我感兴趣的每个课程,有没有办法编写比更好更多<{1}}语句的函数?

2 个答案:

答案 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";
    }
}