"int" 的类对象和 Integer.class - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
esolve

"int" 的类对象和 Integer.class

  •  
  •   esolve 2017 年 4 月 27 日 1717 次点击
    这是一个创建于 3284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Class<integer> c1 = int.class

    这里给人的感觉是 int.class 是 Integer 类对象 但是 System.out.print(int.class)的结果却是 int 怎么理解?

    6 条回复    2017-04-27 22:25:02 +08:00
    momocraft
        1
    momocraft  
       2017 年 4 月 27 日
    这是 Java?

    int.class 是 Class<Integer> 或 Class<?> 对象

    print 出的"int" 来自 https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#toString()
    starvedcat
        2
    starvedcat  
       2017 年 4 月 27 日
    这个问题我不太懂,但是我也想参与一下讨论

    我觉得,int.class 是 Integer 类对象,但它的值是“ int ”,所以楼主说的两者并不矛盾
    argos
        3
    argos  
       2017 年 4 月 27 日
    首先这个语句是编译有错的,如果泛型中是 Integer 则能编译通过。int.class 是原语的类对象,Integer.class 是包装类的类对象。
    argos
        4
    argos  
       2017 年 4 月 27 日
    可以参考 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);
    argos
        5
    argos  
       2017 年 4 月 27 日
    原语的类对象不等于包装类的类对象,以下代码将打印 false。
    Class<Integer> c1 = int.class;
    System.out.println(c1 == Integer.class);
    SoloCompany
        6
    SoloCompany  
       2017 年 4 月 27 日
    楼主的代码是可以编译通过的(忽略拼错成小写的 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 实例
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     894 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 61ms UTC 21:48 PVG 05:48 LAX 14:48 JFK 17:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86