V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhao1014
V2EX  ›  Java

为什么不会报错呢。。。

  •  
  •   zhao1014 · 2019-09-20 10:41:19 +08:00 · 4569 次点击
    这是一个创建于 1892 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ArrayList list1 = new ArrayList<string>();</string>

    list1.add(1);

    编译不报错运行不报错。。 但是这样肯定是会报错的:

    ArrayList<string> list2 = new ArrayList<>();</string>

    list2.add(1);

    17 条回复    2019-09-20 16:10:25 +08:00
    zhao1014
        1
    zhao1014  
    OP
       2019-09-20 10:42:39 +08:00
    </string>这玩意是没有的,我不知道为啥发出来会有个</string>(狗头)。
    airfling
        2
    airfling  
       2019-09-20 10:44:19 +08:00
    ArrayList list1 这里其实是 ArrayList<Object> ,new ArrayList<String> 当然可以给 ArrayList<Object>
    liuhuansir
        3
    liuhuansir  
       2019-09-20 10:44:33 +08:00
    第一种的类型丢失了吧
    Raymon111111
        4
    Raymon111111  
       2019-09-20 10:45:19 +08:00
    第一句之后, list1 里面装的是 Object
    Duluku
        5
    Duluku  
       2019-09-20 10:45:57 +08:00 via iPhone
    说一个题外话、一般都是这么定义的:

    List list1 = new ArrayList<string>();
    misaka19000
        6
    misaka19000  
       2019-09-20 10:48:49 +08:00
    因为 String 类型是 Object 类型的子类型
    secretman
        7
    secretman  
       2019-09-20 10:49:25 +08:00
    看看泛型的类型擦除?
    Beeethoven
        8
    Beeethoven  
       2019-09-20 10:51:08 +08:00   ❤️ 1
    IDEA 语法检查 ArrayList list1 = new ArrayList<string>();

    会让 string 变灰 建议你直接删了
    Lin0936
        9
    Lin0936  
       2019-09-20 10:52:49 +08:00
    伪泛型,类型擦除了吧
    licht114
        10
    licht114  
       2019-09-20 10:54:28 +08:00
    @Beeethoven ArrayList<String> list1 = new ArrayList<string>();
    这样才会提示,你说的那样不会提示
    chendy
        11
    chendy  
       2019-09-20 10:56:09 +08:00
    ArrayList list,没有指定泛型,啥都可以装
    ArrayList<String> 是一个 ArrayList,可以赋值上去
    因为泛型擦除,所以 <String> 并没有效果

    顺便 List<String> list = new ArrayList<>() 这种写法意义不大,接口更多用在参数 /字段 /返回值上,局部变量这样做意义很小,还会丢掉部分特殊方法
    monkeylyf
        12
    monkeylyf  
       2019-09-20 11:01:57 +08:00
    因为是第一个申明的是 ArrayList<Object>, 1 可以被 autobox 成 Integer 放进去没问题。
    第二个申明的是 ArrayList<String>, 1 不是 String,所以在编译的时候就报类型不匹配的错啦。
    以上都没有到 runtime。
    lenchu
        13
    lenchu  
       2019-09-20 11:15:48 +08:00
    Java 的泛型是伪泛型,只在编译时起作用,字节码里面没有泛型信息
    letianqiu
        14
    letianqiu  
       2019-09-20 11:28:59 +08:00 via Android   ❤️ 1
    @airfling
    @monkeylyf 你们的理解是错误的。ArrayList 和 ArrayList<Object>根本不是同一个东西。ArrayList 其实是 ArrayList<?>
    monkeylyf
        15
    monkeylyf  
       2019-09-20 13:59:32 +08:00
    @letianqiu 你的理解是正确的。
    zhao1014
        16
    zhao1014  
    OP
       2019-09-20 16:06:30 +08:00 via Android
    @airfling 重点是 list.add(1),这里我创建了 String 类型的 Arraylist 但存进去了一个 integer 类型的元素
    zhao1014
        17
    zhao1014  
    OP
       2019-09-20 16:10:25 +08:00 via Android
    @chendy 感谢!解答简明易懂!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:10 · PVG 16:10 · LAX 00:10 · JFK 03:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.