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
源代码
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>
。
所以,下一次可不要直接把这种代码删掉了哦。

浙公网安备 33010602011771号