boolean result = obj instanceof Class
其中,obj 是一个对象,Class 表示一个类或接口。obj 是 class 类(或接口)的实例或者子类实例时,结果 result 返回 true,否则返回 false。
Integer integer = new Integer(1);
System.out.println(integer instanceof Integer); // true
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList arrayList = new ArrayList();
System.out.println(arrayList instanceof List); // true
List list = new ArrayList();
System.out.println(list instanceof ArrayList); // true
public class Person {
}
public class Man extends Person {
}
Person p1 = new Person(); Person p2 = new Man(); Man m1 = new Man(); System.out.println(p1 instanceof Man); // false System.out.println(p2 instanceof Man); // true System.out.println(m1 instanceof Man); // true第 4 行代码中,Man 是 Person 的子类,Person 不是 Man 的子类,所以返回结果为 false。
int i = 0;
System.out.println(i instanceof Integer); // 编译不通过
System.out.println(i instanceof Object); // 编译不通过
Integer i = 1;
System.out.println(i instanceof null); // false
Syntax error on token "null", invalid ReferenceType
所以 class 只能是类或者接口。Person p1 = new Person(); System.out.println(p1 instanceof String); // 编译报错 System.out.println(p1 instanceof List); // false System.out.println(p1 instanceof List<?>); // false System.out.println(p1 instanceof List<Person>); // 编译报错上述代码中,Person 的对象 p1 很明显不能转换为 String 对象,那么
p1 instanceof String
不能通过编译,但p1 instanceof List
却能通过编译,而instanceof List<Person>
又不能通过编译了。关于这些问题,可以查看Java语言规范Java SE8版寻找答案,如图所示。
boolean result; if (obj == null) { result = false; // 当obj为null时,直接返回false } else { try { // 判断obj是否可以强制转换为T T temp = (T) obj; result = true; } catch (ClassCastException e) { result = false; } }在 T 不为 null 和 obj 不为 null 时,如果 obj 可以转换为 T 而不引发异常(ClassCastException),则该表达式值为 true ,否则值为 false 。所以对于上面提出的问题就很好理解了,
p1 instanceof String
会编译报错,是因为(String)p1
是不能通过编译的,而(List)p1
可以通过编译。A instanceof B ? A : C
判断 A 是否可以转换为 B ,如果可以转换返回 A ,不可以转换则返回 C。下面通过一个例子来讲解,代码如下:public class Test { public Object animalCall(Animal a) { String tip = "这个动物不是牛!"; // 判断参数a是不是Cow的对象 return a instanceof Cow ? (Cow) a : tip; } public static void main(String[] args) { Sheep sh = new Sheep(); Test test = new Test(); System.out.println(test.animalCall(sh)); } } class Animal { } class Cow extends Animal { } class Sheep extends Animal { }以上代码中,我们声明了一个 Animal 类作为父类,Cow 类和 Sheep 类为 Animal 的子类,在 Test 类的 main 函数中创建类 Sheep 的对象作为形参传递到 animalCall 方法中,因为 Sheep 类的对象不能转换为 Cow 类型,所以输出结果为“这个动物不是牛!”。
本文链接:http://task.lmcjl.com/news/10630.html