2016-04-10 3 views
10

Если я пытаюсь использовать оператор instanceof с неправильным классом, я получаю ошибку компиляции («Animal не может быть преобразован в String»), но с интерфейсом я не получаю ошибку времени компиляции.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"); 
     } 
    } 

} 
+0

Пожалуйста, укажите точное сообщение об ошибке в вопросе. –

+0

Рассмотрите это: 'class B extends Animal реализует List'. Теперь это: «Animal a = new B();' – njzk2

+0

@Tunaki У вас также есть «Dupehammer®» - почему вы его не закрыли? (Вероятно: вы так же нерешительны, как я ...: - /) – Marco13

ответ

18

a никогда не быть InstanceOf строка, поэтому ошибка компиляции.

a может быть экземпляром List если некоторые суб-класс Animal будет реализовывать интерфейс List и вы бы присвоить экземпляр такого суб-класса a. Поэтому компилятор допускает это.

От JLS:

Если бросок (§15.16) в ВыраженияОтношении к ReferenceType будет отвергнут как ошибка времени компиляции, то InstanceOf реляционного выражения также приводит к ошибке времени компиляции. В такой ситуации результат выражения instanceof никогда не может быть правдой.

+1

Является ли java недопустимым множественное наследование является основной причиной? В то же время любой подкласс может реализовать интерфейс всякий раз, когда он захочет? – nantitv

+3

@nantitv Да. Поскольку Animal не является подклассом String, любой подкласс Animal не может быть подклассом String. Хотя в вашем конкретном фрагменте это не изменило бы значение, даже если было разрешено множественное наследование, поскольку String является окончательным и не может быть подклассифицировано. – Eran

+0

Спасибо. String Я просто взял его для примера. – nantitv

1

Просто эксперимент, который я сделал с этим вопросом.

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 Безоперационных его суб-класс может стать и экземпляром AnimalB. Но, с другой стороны, любой из его подклассов может реализовать список interface.

 Смежные вопросы

  • Нет связанных вопросов^_^