gpt4 book ai didi

java - int.class.isInstance(Object) 是矛盾的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:29 25 4
gpt4 key购买 nike

这是一个例子:

public boolean check(Class<?> clazz, Object o)
{
return clazz.isInstance(o);
}

check(int.class, 7); // returns false

isInstance接受 Object , 它不适用于 int ,因为 int是原始类型并自动装箱为 Integer .那么是否有可能编写一个通用的检查方法?或者我应该确保clazz 的类型是 Class<? extends Object>

最佳答案

并不是所有的Class对象都代表类/引用类型;还有 Class 对象表示原始类型。这很有用,因为在对字段和方法使用反射时,您经常需要指定它们的类型,它可以是原始类型。所以 Class 用于表示所有此类前泛型类型。

但是,Class 类的许多方法对基本类型没有意义。例如,一个对象不可能是instanceof int。因此,类似的 .isInstance() 方法将始终返回 false。由于该方法的参数是 Object 类型,从语言的角度来看,您传入的内容根本不可能是原始类型。

当然,在 Java 5+ 中,当您将原语传递给 Object 类型的参数时,它会进行自动装箱,但它进行自动装箱的事实意味着 passed 实际上是一个对象的引用。引用类型和原始类型是不同的。参数是引用类型或原始类型。因此,您不能编写可以采用“引用或原语”的方法。

在您的示例中,您可能要问的是检测该对象是从基元自动装箱的,并将其与基元类型进行比较。但是,无法检测调用者是否对其进行了自动装箱,因为自动装箱是在调用之前发生的完全调用者端操作。

但是,假设它是自动装箱的,您知道它应该转到什么类型。如果您需要一个 int,并且它被自动装箱并传递给您的方法,那么它应该是 Integer 的一个实例。因此,您可以做的是,当 clazz 表示原始类型时,改为对其包装类执行检查。因此,当它发现 clazzint.class 时,将其替换为 Integer.class,然后执行检查。请注意,这种方式仍然无法判断作为 o 参数传递的内容是否被自动装箱。

关于java - int.class.isInstance(Object) 是矛盾的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com