2013-09-15 5 views
1
interface Flyer{ } 
class Bird implements Flyer { } 
class Eagle extends Bird { } 
class Bat { } 

public class TestClass { 

public static void main(String[] args) { 
    Flyer f = new Eagle(); 
    Eagle e = new Eagle(); 
    Bat b = new Bat(); 

    if(f instanceof Flyer) System.out.println("f is a Flyer"); 
    if(e instanceof Bird) System.out.println("e is a Bird"); 
    if(b instanceof Bird) System.out.println("f is a Bird"); 
    } 
} 

Это пример кода из Enthuware. Я не могу понять, почему третий оператор instanceof (b instanceof Bird) не оценивает значение false, но вместо этого дает мне ошибку времени компиляции. P.S. -i не может получить то, что Enthuware пытался объяснить мнеinstanceof enthuware OCAJP

В компиляции ошибки времени, которое я получил, был

TestClass.java:16: Ошибка: неконвертируемые типы

если (б InstanceOf Bird) Система .out.println («f - птица»); ^

требуется: Птица

найдено: Bat

1 ошибка

+0

Следующая ссылка имеет очень хорошее объяснение на ваш вопрос. http://stackoverflow.com/questions/31398444/the-instanceof-operator-behaves-differently-for-interfaces-and-classes –

ответ

2

оператор InstanceOf оценивает истинным или ложным, только если объекты связаны между собой через некоторое наследование и бросает ошибку в противном случае

0

третье условие дает ошибку времени компиляции, так как Bat не распространяется на Bird, и как вторая причина, по которой класс Java может распространять не более одного класса, невозможно, чтобы подкласс Bat не распространялся на Класс Bird и на основе этого правила JVM достаточно умен, чтобы понять, что Бат не может быть Птицей.