这是一个例子:
public boolean check(Class<?> clazz,Object o) { return clazz.isInstance(o); } check(int.class,7); // returns false
由于isInstance接受一个Object,因此它不能与int一起使用,因为int是一个基本类型并被自动装箱到Integer.
那么是否可以编写通用的检查方法?或者我应该确定
clazz属于Class<?扩展对象>?
解决方法
并非所有Class对象都表示类/引用类型;还有表示基本类型的Class对象.这很有用,因为在使用带有字段和方法的反射时,通常需要指定它们的类型,它可以是基本类型.所以Class用于表示所有这些pre-generics类型.
但是,Class类的许多方法对原始类型没有意义.例如,对象不可能是instanceof int.因此,类似的.isInstance()方法将始终返回false.由于该方法的参数是Object类型,因此从语言的角度来看,传递给它的是原始类型是不可能的.
当然,在Java 5中,当您将一个原语传递给Object类型的参数时,它会经历自动装箱,但它经历了自动装箱的事实意味着传递的内容实际上是对对象的引用.引用类型和基元类型是不同的.参数是引用类型或基本类型.因此,您无法编写可以采用“引用或原语”的方法.
在您的示例中,您可能要问的是检测对象是否从基元自动装箱,并将其与基本类型进行比较.但是,无法检测呼叫者是否对其进行了自动装箱,因为自动装箱是在呼叫之前发生的完全呼叫方操作.
但是,假设它是自动装箱的,你知道应该去哪种类型.如果您期望一个int,并且它被自动装箱并传递给您的方法,那么它应该是Integer的一个实例.因此,您可以做的是,当clazz表示基本类型时,而是对其包装类执行检查.因此,当它看到clazz是int.class时,用Integer.class替换它,然后执行检查.请注意,这种方式仍然无法判断作为o参数传递的内容是否已自动装箱.