HashSet не может быть преобразован в строковую ошибку с оператором instanceof - PullRequest
0 голосов
/ 24 октября 2018

У меня есть эти вложенные хэш-наборы, внутри которых содержатся String значения.

{{a, b}, {b, c}, {c, e}}

В какой-то момент моего кода я не знаю, имею ли я дело с внутренним хэш-сеттом или внешним.Я пытаюсь определить, используя следующую строку кода:

System.out.println(loopIterator3.next() instanceof String);
 //(FYI :Iterator <HashSet> loopIterator3 = hsConc2.iterator();)

Эта строка кода, кажется, генерирует ошибку:

prog.java: 61: ошибка: несовместимаятипы: HashSet не может быть преобразован в String System.out.println (loopIterator3.next () instanceof String);

Когда loopIterator3 действительно пересекает внутренний хэш-набор, я ожидал бы, что это займетСтроковые значения.Почему компилятор считает, что это хэш-сет?Кроме того, почему компилятор думает, что я пытаюсь конвертировать?

Есть мысли / предложения?

import java.util.Arrays;
import java.util.HashSet;

class Scratch {
    public static void main(String[] args) {
        HashSet<HashSet<String>> hashSets = new HashSet<>(Arrays.asList(newSet("a", "b"), newSet("b", "c"), newSet("c", "e")));

        System.out.println(hashSets.iterator().next() instanceof String); //error
        System.out.println(hashSets.iterator().next().iterator().next() instanceof String);
    }

    private static HashSet<String> newSet(String... str) {
        return new HashSet<>(Arrays.asList(str));
    }
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

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

Источник: - https://docs.oracle.com/javase/specs/jls/se7/jls7.pdf (стр. 513)

Например, a instanceof B (a является объектом класса A), если A и B не совпадаютheirarchy, т. е. они не являются подклассом или суперклассом ни того, ни другого, тогда это ошибка времени компиляции, потому что, если они не находятся в одной и той же иерархии, то a не является экземпляром B. Таким образом, компилятор показывает ошибку только во время компиляции.

В вашем случае HashSet не является подклассом или суперклассом String и наоборот, поэтому он показывает ошибку времени компиляции

0 голосов
/ 24 октября 2018

Эта ошибка вызвана тем, что HashSet и String не связаны.Я вижу, что вы уже знаете тип объекта, возвращаемого методом next().Я не понял цели.Тем не менее, если вам нужна эта проверка, попробуйте что-то вроде ниже-

Object obj = loopIterator3.next();
String.class.isInstance(obj);
...