11

我发现原始类型问题

System.out.println("Integer.class.isAssignableFrom(int.class) = " + Integer.class.isAssignableFrom(int.class));
System.out.println("int.class.isAssignableFrom(Integer.class) = "+int.class.isAssignableFrom(Integer.class));

这两个语句都向调用者返回 false。所以这似乎拳击在这里不适用。我的问题是我的观察是否正确,或者是否有其他 API 可以正确进行此测试?

--------------------------------跟进---------------- -----------------------------------------

正如我所说,我主要想在使用反射时检查对象是否可分配给字段。我希望该机制在运行时可以更精确,所以我做了一个这样的实现。

    public static boolean isAssignableFrom(final Field field, final Object obj) {


        if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
            return obj.getClass().equals(Integer.class) || field.getType().equals(int.class);
        } else if (field.getType().equals(Float.class) || field.getType().equals(float.class)) {
            return obj.getClass().equals(Float.class) || field.getType().equals(float.class);
        } else if (field.getType().equals(Double.class) || field.getType().equals(double.class)) {
            return obj.getClass().equals(Double.class) || field.getType().equals(double.class);
        } else if (field.getType().equals(Character.class) || field.getType().equals(char.class)) {
            return obj.getClass().equals(Character.class) || field.getType().equals(char.class);
        } else if (field.getType().equals(Long.class) || field.getType().equals(long.class)) {
            return obj.getClass().equals(Long.class) || field.getType().equals(long.class);
        } else if (field.getType().equals(Short.class) || field.getType().equals(short.class)) {
            return obj.getClass().equals(Short.class) || field.getType().equals(short.class);
        } else if (field.getType().equals(Boolean.class) || field.getType().equals(boolean.class)) {
            return obj.getClass().equals(Boolean.class) || field.getType().equals(boolean.class);
        } else if (field.getType().equals(Byte.class) || field.getType().equals(byte.class)) {
            return obj.getClass().equals(Byte.class) || field.getType().equals(byte.class);
        }
        return field.getType().isAssignableFrom(obj.getClass());
    }

}

这似乎是我能做的最好的-_-!谢谢

4

4 回答 4

11

我想,ClassUtils.isAssignable(Class, Class, boolean)来自 Apache commons-lang 是可以提供帮助的。

JavaDoc

于 2013-05-11T14:35:37.120 回答
6

int.class并且Integer.class是两个独立的类对象。检查this答案以获取更多详细信息

来自 Java 文档Class#isAssignableFrom

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回 true;否则返回false。如果此 Class 对象表示原始类型,则如果指定的 Class 参数正是此 Class 对象,则此方法返回 true;否则返回false。

于 2013-01-04T06:05:31.433 回答
3

文档isAssignableFrom

此方法测试指定的 Class 参数表示的类型是否可以通过标识转换或扩展引用转换转换为此 Class 对象表示的类型。有关详细信息,请参阅 Java 语言规范,第 5.1.1 和 5.1.4 节。

Integer不能通过这种方式分配给一个int(反之亦然),因此您的方法将返回 false - 装箱和拆箱是在编译时完成的,而不是在运行时 - 请参阅本文以获取更多信息

于 2013-01-04T06:06:43.643 回答
0

只是提示,您在上面粘贴的代码中有一个错误。如果你用“field=int.class”调用方法,不管对象是什么类型,方法总是返回true。似乎是复制和粘贴错误;)

if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
        return obj.getClass().equals(Integer.class) || field.getType().equals(int.class);

更好的是:

if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
        return obj.getClass().equals(Integer.class) || obj.getType().equals(int.class);
于 2020-11-16T09:13:31.420 回答