大神们,这道 Java 题怎么说 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
WhereverYouGo
V2EX    程序员

大神们,这道 Java 题怎么说

  •  
  •   WhereverYouGo 2020-06-15 18:03:20 +08:00 2969 次点击
    这是一个创建于 1952 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大神们,这题怎么说?

    图片
    原地址: http://www.yinwang.org/blog-cn/2020/02/13/java-type-system

    12 条回复    2020-06-16 12:52:07 +08:00
    lovelive1024
        1
    lovelive1024  
       2020-06-15 18:11:51 +08:00
    debug 运行一次就可以看到,b 实际上的类型还是 String[],赋值 Integer 类型会出错
    aragakiyuii
        2
    aragakiyuii  
       2020-06-15 18:19:18 +08:00 via iPhone
    这种跟方法参数是(Object...)或者范型(T...)一样吧。idea 会提示 warning,解释这种为什么不行,要换成 List
    qianProgrammer
        3
    qianProgrammer  
       2020-06-15 18:21:42 +08:00
    b 只是用指针指向了 a 在堆中创建的对象,也就是说 b 是一个 String[]数组
    ychost
        4
    ychost  
       2020-06-15 19:26:51 +08:00
    记得 JDK List.toArray(T[]) 也有类似的问题
    xuanbg
        5
    xuanbg  
       2020-06-15 19:29:45 +08:00
    Java 假泛型的锅
    thinkingInJava
        6
    thinkingInJava  
       2020-06-15 19:57:07 +08:00
    java 只有值传递,变量 a 存的是数组 newString[]在内存堆里的地址句柄。
    Object[]b 声明了一个 Object[]数组的引用,在栈的临时变量区。
    将地址句柄 a 赋给 b,变量 b 指向 String[]数组;
    b[1] = Integer.valueOf(42);
    到目前这步,编译器不会报错,因为万物皆对象,除了基本类型会被直接替代为 16 进制,
    引用类型都是 object 子类,更严格是 java.lang.reflect 包下。
    父类引用用来限定类型,同泛型一样,编译期检查,Integer 是 Object 子类,符合,所以编译通过。
    但运行会抛数组存储异常。

    同理:楼主也可以这样试一试:

    Number[] a = new Double[2];
    a[0] = new Integer(4);
    Integer 继承 Number,一样道理。

    嗦了,不知道有没有回答到点上。
    thinkingInJava
        7
    thinkingInJava  
       2020-06-15 19:59:06 +08:00
    @xuanbg 对,泛型擦除,忘记表述这个了。泛型只在编译期检查,一切在 jvm 都是 object
    daozhihun
        8
    daozhihun  
       2020-06-15 20:18:20 +08:00
    最后一行报错。
    java 有个蛋疼的机制要做协变,就是父类的数组可以指向子类的数组(但是泛型又不行),不过在编译时不会出错,因为编译器无法知道你的具体类型,但是在运行时 jvm 还是会进行检查,发现类型不一致就会出错
    aguesuka
        9
    aguesuka  
       2020-06-15 20:29:26 +08:00 via Android   1
    王垠就这点水平吗?爱了爱了
    Mistwave
        10
    Mistwave  
       2020-06-15 20:56:11 +08:00
    编译时:
    第一行没问题
    第二行,Java Array 是协变的,可以通过类型检查,没问题(如果是 List 就不行,List 是不变的)
    第三行,显然没问题
    第四行,Integer 赋值给 Object variable,可以通过类型检查

    运行时:
    第一行没问题,堆上创建一个 String[],reference 赋值给 a
    第二行,将第一行 new String[2]的 reference 赋值给 b (打印 a 和 b,是一样的
    第三行,没问题
    第四行,将一个 Integer 放进 String,报错,会抛出 ArrayStoreException

    简化版:
    Object[] o = new String[2]
    o[1] = Integer.valueOf(42)
    编译通过,运行报错同上
    xyooyx
        11
    xyooyx  
       2020-06-16 08:44:19 +08:00
    ```
    public static f()V
    L0
    LINENUMBER 22 L0
    ICONST_2
    ANEWARRAY java/lang/String
    ASTORE 0
    L1
    LINENUMBER 23 L1
    ALOAD 0
    ASTORE 1
    L2
    LINENUMBER 24 L2
    ALOAD 0
    ICONST_0
    LDC "hi"
    AASTORE
    L3
    LINENUMBER 25 L3
    ALOAD 1
    ICONST_1
    BIPUSH 42
    INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
    AASTORE
    L4
    LINENUMBER 26 L4
    RETURN
    L5
    LOCALVARIABLE a [Ljava/lang/String; L1 L5 0
    LOCALVARIABLE b [Ljava/lang/Object; L2 L5 1
    MAXSTACK = 3
    MAXLOCALS = 2
    ```
    ica10888
        12
    ica10888  
       2020-06-16 12:52:07 +08:00
    https://www.zhihu.com/question/371957442
    善用搜索引擎。
    另外,我发现 yin wang 每一篇博文都有对应的问题和讨论,有意思。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2452 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 15:25 PVG 23:25 LAX 08:25 JFK 11:25
    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