【发布时间】:2015-12-13 09:12:25
【问题描述】:
Integer.class、int.class 和 Integer.TYPE 有什么区别?我对这三者有点困惑。
【问题讨论】:
-
Integer.TYPE 和 int.class 是一样的。
标签: java
Integer.class、int.class 和 Integer.TYPE 有什么区别?我对这三者有点困惑。
【问题讨论】:
标签: java
i 是 int 还是 Integer:
Integer.class.isInstance(i) 返回true
int.class.isInstance(i) 返回false
Integer.TYPE.isInstance(i) 返回false
让我们了解isInstance。
public boolean isInstance(Object obj)确定指定的对象是否与该类表示的对象分配兼容。
它将Object 作为参数,而不是原始类型。传入的任何int 都将被装箱为Integer,因此可以将其传递给方法。
Integer.class 是一个类文字,与引用类型一起使用,即对该类的 Class 对象的引用。
这个方法看到的Integer对象肯定是Integer类的一个实例,所以Integer.class.isInstance(i)返回true。
然而,int.class 和 Integer.TYPE 各自代表 int 原始类型,而不是 Integer 类,并且 Integer 不是 int,尽管事实上 Java 通常可以互换使用它们,由于装箱和拆箱。这解释了来自int.class.isInstance(i) 和Integer.TYPE.isInstance(i) 的两个false 输出。
根据Javadocs for Integer,Integer.TYPE 从 1.1 版本就已经存在。
但是class literals have also been around since 1.1.
当类文字语法可用时,需要类对象作为方法参数的 Java API 更容易使用。
类文字使reflection, which was also new in Java 1.1 的使用变得非常容易。
如果int.class 表示与引用类文字一致的int 原始类型,则尚不清楚为什么存在Integer.TYPE。它们是等价的,比较它们时== 产生true。
【讨论】:
int.class == Integer.TYPE。它们是同一个对象。其次,int.class(或Integer.TYPE)在处理反射时很有用。 Class 的几个方法期望 Class 对象作为参数,这些对象表示构造函数或方法的参数类型。当参数是int 时,则使用int.class(或Integer.TYPE)来表示该参数。最后,Integer.class 表示作为Integer 实例的对象类(不是原始int 值)。
int.class 看起来很奇怪;更不用说void.class
Integer.TYPE 是Class<Integer> 的类型误导了。 docs 清楚地表明Integer.TYPE 是“代表原始类型int 的Class 实例。”。编写一个程序来测试这一点很容易:int.class == Integer.TYPE 将是true;对于任何Integer 变量i,i.getClass() == Integer.class 将是true; Integer.class == Integer.TYPE 将是 false。此外,Integer.TYPE.isPrimitive() 将返回 true。