Instanceof не показывает ошибку компиляции с интерфейсом, но с абстрактным классом делает - PullRequest
0 голосов
/ 29 июня 2018

Я думаю, что название само за себя. Итак, предположим, у меня есть этот код:

interface A { }

abstract class B { }

class C { }

C c = new C();

System.out.println(c instanceof A); //fine
System.out.println(c instanceof B); // compile error

В комментарии от к вопросу Я прочитал это:

Компилятор никогда не узнает, реализует ли данный тип интерфейс, потому что потенциальный подкласс может его реализовать.

Так что, если для interface это работает, то почему оно не должно работать для abstract class? Он также должен быть расширен другим классом, поскольку он не может существовать самостоятельно. Может кто-нибудь уточнить это?

Обновление Скомпилировать сообщение:

Ошибка: (22, 28) Java: несовместимые типы: C не может быть преобразован в B

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Взять например

class D extends C implements A{}

C c = new D();

Компилятор может сразу сказать, что c никогда не может ссылаться на экземпляр B, потому что если класс расширяет C, он также не может расширять B. Как показывает приведенный выше пример, этого нельзя сказать об интерфейсах.

0 голосов
/ 29 июня 2018

Это потому, что абсолютно невозможно создать экземпляры абстрактного класса в Java. Оператор instanceof вызывается из класса Object и не может быть вызван, если не существует экземпляра класса, который отозвал его (объект).

0 голосов
/ 29 июня 2018

Это просто: C расширяет Object. Ни один подкласс C не может расширить B. Вы не можете добавить другой базовый класс, потому что Java не поддерживает множественное наследование.

Принимая во внимание, что подкласс C может очень хорошо реализовать этот дополнительный интерфейс. Но просто нет способа, которым объект C мог бы также быть экземпляром B.

Итак:

D extends C implements B // obviously all fine

, тогда как

D extends B extends C 

невозможно. Поскольку B уже определено до , не расширяет что-либо, кроме Object. Конечно, «хитрость» заключается в том, что оба класса B, C оба известны, и, как сказано: C не расширяет B.

...