带接口的实例

instanceof with an interface

如果我尝试使用错误的 instanceof 运算符 class,我会收到编译错误(“Animal cannot be converted to String”),但使用接口时我不会收到编译时错误。

例如:在第 10 行中,我收到一个编译错误,因为 Animal 不是 String 的子class。但是在第 14 行,即使 Animal 没有实现 List 接口,我也没有收到编译错误。

class Animal {

}

public class InstanceOf {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
         Animal a = new Animal();
        if (a instanceof String ){  //line 10
            System.out.println("True");
        }

         if (a instanceof List ){ //line 14
            System.out.println("True");
        }
    }

}

a 永远不能是 String 的 instanceof,因此会出现编译错误。

a 可以是 List 的实例,如果 Animal 的某些子 class 将实现 List 接口并且您将分配一个实例这样子class到a。因此编译器允许它。

来自 JLS :

If a cast (§15.16) of the RelationalExpression to the ReferenceType would be rejected as a compile-time error, then the instanceof relational expression likewise produces a compile-time error. In such a situation, the result of the instanceof expression could never be true.

这只是我根据这个问题做的实验。

class Animal {}
interface AnimalA {}
class AnimalB{} 

class AnimalC extends Animal,AnimalB {} //not possible
class AnimalD extends Animal implements AnimalA{} //possible   

public class InstanceOfTest {

    public static void main(String[] args) {
        Animal a = new Animal();
        if(a instanceof AnimalA) { //no compile time error
            System.out.println("interface test");
        }
        if(a instanceof AnimalB) { //compile time error
            System.out.println("interface test");
        }
        if(a instanceof List) { //compile time error
            System.out.println("interface test");
        }
        if(a instanceof ArrayList) { //compile time error
            System.out.println("interface test");
        }
    }
}

因此正如@Eran 所说,因为 Animal 不是 AnimalB 的子 class,其子 class 的子class 不能成为 [= 的实例12=]。但另一方面,它的任何子 class 都可以实现 interface List.