idea的自动提示,并不一定正确

一个必为false的instanceof?

package com.wangshouyishisanxiang.demo;

import java.util.Arrays;
import java.util.List;


public class instanceOfDemo {


    public static Object getObject(){
        return Arrays.asList(new ObjectImpossible("abc", "cde"));
    }

    public static void main(String[] args) {
        List<ObjectOrigin>  testObject = (List<ObjectOrigin>)instanceOfDemo.getObject();
        Object realObject = testObject.get(0);
        if(realObject instanceof ObjectImpossible){
            System.err.println("Ops! That makes no sense!");
        }else {
            System.out.println("Thats it!");
        }

    }
}

光标移至if(realObject instanceof ObjectImpossible) 这一行时,idea会提示
Condition 'realObject instanceof ObjectImpossible' is always 'false'。

ObjectImpossible 与 ObjectOrigin 没有父子关系

这里的输出是什么?

读者可以思考几秒钟

...

...

...

好了,时间到。答案是百分之百的Ops! That makes no sense!

原因也很浅显,Type Erasure 类型擦除

通过工具,编译出这一行的字节码(使用java版本是1.8)

List testObject = (List)instanceOfDemo.getObject();

源代码
 List<ObjectOrigin>  testObject = (List<ObjectOrigin>)instanceOfDemo.getObject();
字节码
L0
    LINENUMBER 14 L0
    INVOKESTATIC com/oldratlee/fucking/concurrency/imposibleInstanceOf/instanceOfDemo.getObject ()Ljava/lang/Object;
    CHECKCAST java/util/List //注意这一行
    ASTORE 1

可以看到,CHECKCAST java/util/List 这里仅仅是把OBJECT强转为LIST

期望中testObject是List<ObjectOrigin>

但实际上是List<Object>

所以,下一次可不要直接把这种代码删掉了哦。

posted @ 2020-11-15 13:39  图师傅  阅读(758)  评论(0)    收藏  举报