Java 带有接口的instanceof

Java 带有接口的instanceof,java,instanceof,Java,Instanceof,如果我试图将instanceof操作符用于错误的类,我会得到一个编译错误(“动物不能转换为字符串”),但对于接口,我不会得到编译时错误 例如:在第10行,我得到一个编译错误,因为Animal不是String的子类。但在第14行中,我并没有得到编译错误,即使Animal并没有实现List接口 class Animal { } public class InstanceOf { /** * @param args the command line arguments

如果我试图将instanceof操作符用于错误的类,我会得到一个编译错误(“动物不能转换为字符串”),但对于接口,我不会得到编译时错误

例如:在第10行,我得到一个编译错误,因为Animal不是String的子类。但在第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
永远不能是字符串的实例,因此编译错误

a
可以是
List
的实例,如果
Animal
的某个子类将实现
List
接口,并且您将该子类的实例分配给
a
。因此编译器允许它

从:

如果RelationalExpression对ReferenceType的强制转换(§15.16)将作为编译时错误被拒绝,那么RelationalExpression的instanceof同样会产生编译时错误。在这种情况下,instanceof表达式的结果永远不会为真


这只是我从这个问题做的一个实验

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所说,as
动物
不是
动物的一个子类,其子类的非可以成为
动物
的实例。但是另一个子类可以实现<代码>接口<代码>列表。< /P>请包含问题中的确切错误信息。考虑:<代码> B类扩展了动物工具列表< /代码>。现在这个:
animala=newb()@Tunaki您也有“Dupehammer®”-为什么不关闭它?(很可能:你和我一样犹豫不决…:-/)@Marco13不,昨天根本没有投票权:)java不允许多重继承是根本原因吗?同时,任何子类都可以根据需要实现接口?@nantitv Yes。因为动物不是字符串的子类,所以动物的任何子类都不能是字符串的子类。尽管在您的特定代码段中,即使允许多重继承,也不会有什么区别,因为字符串是最终的,不能进行子类划分。谢谢。字符串我只是拿它为例。@nantitv如果你告诉编译器没有
Animal
的子类,它实际上可以推断
instanceof
是毫无意义的:只需用
final class Animal{}
替换
class Animal{}