【求助】对于instanceof的新理解
最近在看《SCJP指南》的时候,有一点理解不透,请大家先看如下的例子:
public class InstanceOfDemo { public static void main(String[] args) { System.out.println(new InstanceOfDemo() instanceof String); //compile time error System.out.println(new InstanceOfDemo() instanceof Exception); //compile time error System.out.println(new InstanceOfDemo() instanceof Object); //compilation and output true System.out.println(new InstanceOfDemo() instanceof List); //compilation and output false }}class Point { int x, y; }class Element { int atomicNumber; }class Test { public static void main(String[] args) { Point p = new Point(); Element e = new Element(); if (e instanceof Point) { // compile-time error System.out.println("I get your point!"); p = (Point)e; // compile-time error } }}
[解决办法]
理解instanceof关键还是需要注意一下泛型。
对于一般的情形,比如
可以看一下这个例子:
import java.util.List;public class Test { public static void main(String[] args) { //编译时无法确定getObject()返回的引用类型的具体类型,下面两句都能通过编译 System.out.println(getObject() instanceof Object); System.out.println(getObject() instanceof String); //编译时可以确定类型的,能够cast则编译通过,否则编译失败 Test test = new Test(); System.out.println(test instanceof Test);//ok System.out.println(test instanceof Object); //ok //System.out.println(test instanceof String);//error! test is not a String //跟泛型相关的注意一下 //List是泛型类型,如果不指定泛型参数,成功编译 System.out.println(test instanceof List); //如果不限定类型界限,通过编译 System.out.println(test instanceof List<?>); //指定泛型参数,编译时可确定类型,如果不能cast,编译不通过 //System.out.println(test instanceof List<Test>); //error! } public static Object getObject() { return "Test"; }}