Почему ошибка времени компиляции в операторе instanceof, но отлично работает при кастинге

Мой вопрос в том, что, поскольку new Test() не является ни подклассом String, ни самой строкой, то почему компиляция instanceof завершается неудачно? Разве он не должен возвращать false.

    public class Test{
        public static void main(String[] args) {
       //Compiles fails
       System.out.println(new Test() instanceof String);
      //compiles fine but run time class cast exception.   
        Test = (Test) new Object();;
        }
    }

Теперь я отредактировал свой пост. Вот что я действительно хочу знать, почему такая разница. Почему компиляция не дает сбой при кастинге, хотя должна


person Sachin Sachdeva    schedule 06.03.2017    source источник
comment
Каково сообщение компилятора?   -  person Tatranskymedved    schedule 06.03.2017
comment
Компилятор говорит: несовместимые условные типы операндов TypeCasting и String   -  person Sachin Sachdeva    schedule 06.03.2017
comment
Object t=new Test(); if(t instanceof String ){ } если вы скажете new Test() instanceof String, то вы уже знаете, что это не строка. instanceof работает, если вы не уверены, к какому типу относится объект   -  person XtremeBaumer    schedule 06.03.2017
comment
Но именно поэтому экземпляр оператора появляется на картинке, я знал, но по логике он должен показывать false, поскольку результат вместо неудачной компиляции.   -  person Sachin Sachdeva    schedule 06.03.2017
comment
Это не дубликат, пожалуйста, проверьте еще раз, они говорят, почему нет ошибки компиляции, я ищу здесь объяснение, почему есть ошибка, хотя она должна быть ложной   -  person Sachin Sachdeva    schedule 06.03.2017
comment
Это объясняется в первом дублирующем предложении.   -  person Chris311    schedule 06.03.2017
comment
Я отредактировал свой вопрос, пожалуйста, проверьте.   -  person Sachin Sachdeva    schedule 06.03.2017


Ответы (2)


instanceof нельзя применять, если во время компиляции гарантируется, что он всегда возвращает false.

Правило состоит в том, что если приведение первого операнда к типу второго операнда всегда выдает ClassCastException, компилятор не позволяет применять оператор instanceof к этим операндам.

Экземпляр вашего класса Test никогда не может быть экземпляром java.lang.String.

15.20.2. Оператор сравнения типов instanceof

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

person Eran    schedule 06.03.2017
comment
Я отредактировал свой вопрос, пожалуйста, проверьте. - person Sachin Sachdeva; 06.03.2017
comment
@ShowStopper Вы должны думать о (String) new Test(), а не (Test) new Object(). - person Axel; 06.03.2017

Компилятор знает, что иерархия типов String — это Object>String, а иерархия Test — это Object>Test, поэтому это никогда не может быть правдой.

person Ramsay Domloge    schedule 06.03.2017