Как я могу заставить этот экземпляр Java instanceof возвращать ложь, а не ошибку? - PullRequest
0 голосов
/ 27 апреля 2019

Я экспериментировал с instanceof в своем коде Java.

public class Test {
    public static void main(String[] args) {
        String favoriteFood = "sandwich";
        boolean flag = favoriteFood instanceof StringBuilder; //incompatible types
    }
}

Я получаю сообщение об ошибке из-за того, что String не может быть приведен к StringBuilder.Я понимаю, что тестирование String для проверки того, является ли он экземпляром StringBuilder, нелогично, поскольку строки никогда не могут быть преобразованы как StringBuilders.Я также понимаю преимущества быстрого провала.Однако есть ли способ запустить этот тест и вернуть false?Я просмотрел похожие посты, но они больше связаны с тем, почему возникает ошибка, чем с тем, что с ней делать.

(я знаю, что практической необходимости в этом нет. Я просто хочу знать,это можно сделать. Если да, то как? Если нет, то почему нет?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2019

Самый простой подход:

boolean flag = false;

но если вам это не нравится по какой-то причине, вы можете написать:

boolean flag = ((Object)favoriteFood) instanceof StringBuilder; // false

, а затем подкупите сотрудника, чтобы он прошел проверку кода.

1 голос
/ 27 апреля 2019

Ответом на If not, then why not? является «потому что спецификация языка так говорит» (см. Комментарий Карлоса Х.).

А ответом «почему спецификация языка так говорит» является то, что язык определяетЭта тенденция запрещает конструкции, которые не имеют смысла, когда это возможно, и эта тенденция вдохновлена ​​их верой в то, что, делая это, они помогают вам писать лучший код.

РЕДАКТИРОВАТЬ

re,«действительно ли определение логического значения как (2 + 2 == 5) имеет более логичный смысл, чем ...»: нет, это не так, но:

(a) это невозможно (то естьнеосуществимо с точки зрения логистики) для определителей языка провести инвентаризацию всего, что может быть написано, но не имеет логического смысла (*)
(b) проблема такого рода сводится к доказательству пустоты набора (например, доказательство того, что множество всехвозможные экземпляры String, которые также являются экземплярами StringBuilder (пустые) и доказывают пустоту набора в общем , поскольку проблема является NP-трудной.Учитывая конкретную дополнительную информацию, это может быть возможно, а иногда и делается, например, учитывая иерархию типов, которая почти буквально говорит: «StringBuilder также не может быть StringBuilder».Но в общем , это невозможно исправить.Вот почему вы всегда будете находить случаи, если только вы продолжаете искать достаточно усердно.

(*) Для вашего чувства «логического смысла», но что вы(/ мы все) действительно имеем в виду, на самом деле это просто «хорошая практика программирования», одним из которых было бы «избегать запутанных способов написания false».Это может показаться вам нелогичным, но в логике нет понятия «логический смысл».2+2==5 это просто еще одно логическое утверждение, и оно оказывается ложным.Логика не жалуется на ложь, она просто наблюдает за ними.

(PS Я знаю, что использовал "не имеет смысла" тоже, не должен был, но я позволил себе увлечься.)

...