Class<integer> c1 = int.class
这里给人的感觉是 int.class 是 Integer 类对象 但是 System.out.print(int.class)的结果却是 int 怎么理解?
1
momocraft 2017-04-27 13:01:55 +08:00
这是 Java?
int.class 是 Class<Integer> 或 Class<?> 对象 print 出的"int" 来自 https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#toString() |
2
starvedcat 2017-04-27 13:19:55 +08:00
这个问题我不太懂,但是我也想参与一下讨论
我觉得,int.class 是 Integer 类对象,但它的值是“ int ”,所以楼主说的两者并不矛盾 |
3
tianshuang 2017-04-27 14:11:58 +08:00
首先这个语句是编译有错的,如果泛型中是 Integer 则能编译通过。int.class 是原语的类对象,Integer.class 是包装类的类对象。
|
4
tianshuang 2017-04-27 14:19:08 +08:00
可以参考 Integer 类的源码:
/** * The {@code Class} instance representing the primitive type * {@code int}. * * @since JDK1.1 */ @SuppressWarnings("unchecked") public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int"); 以下代码将打印出 true。 Class<Integer> c1 = int.class; System.out.println(c1 == Integer.TYPE); |
5
tianshuang 2017-04-27 14:26:48 +08:00
原语的类对象不等于包装类的类对象,以下代码将打印 false。
Class<Integer> c1 = int.class; System.out.println(c1 == Integer.class); |
6
SoloCompany 2017-04-27 22:25:02 +08:00
楼主的代码是可以编译通过的(忽略拼错成小写的 Integer 的问题)
的确 int 和 Intege 是两个完全不相容的类型,但在 jdk 的泛型化定义里面,所有 primative type 的 representing Class instance 的泛参类型就是其所对应的 wrapper class (泛参类型不可以是 primative type) int.class / Integer.TYPE / Class.getPrimitiveClass("int ”) 都是同一个实例 而且看 java.lang.Integer 的源码,有很清楚的定义 /** * The {@code Class} instance representing the primitive type * {@code int}. * * @since JDK1.1 */ @SuppressWarnings("unchecked") public static final Class<Integer> TYPE = (Class<Integer>) Class.getPrimitiveClass("int"); 而且这几个 primitive type 所对应的 class instance 有些很有意思的特性 可以试运行一下以下这段代码: https://gist.github.com/lwr/666d1a4ce985810ce3318cbe1ad76fb0 (要让它能跑起来,还需要实现两个很简单的方法) 我们还可以发现最后一个比较有意思的 primitive type: void <-> Void 虽然 void 不代表任何内容, 但在语言层面还是给它留下了两个 class 实例 |