Что вызывает ошибку «Несовместимые типы операндов»? - PullRequest
1 голос
/ 27 августа 2011

Я пытаюсь реализовать интерфейс iSortableStack через класс.

Вот моя основная функция,

public class SampleStack<E> {
    E ch;

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws IOException {
        ISortableStack<Character> s = new SortableStack<Character>();
        SampleStack demo = new SampleStack();
        while ((demo.ch == System.in.read()) != '\n')
            if (!s.isFull())
                s.push((Character) demo.ch);
        while (!s.isEmpty())
            System.out.print(s.pop());
        System.out.println();
    }
}

Но я получаю одну ошибку в этой строке,

while ((demo.ch == System.in.read()) != '\n')

Ошибка: несовместимые типы операндов Object и int

Что здесь не так?

Ответы [ 5 ]

4 голосов
/ 27 августа 2011

Здесь есть две серьезные проблемы, которые не имеют ничего общего с генериками.

Во-первых, demo.ch == System.in.read() - это выражение boolean.Результат read() (int) будет автоматически упакован в Integer, и идентичность этого объекта будет проверена по demo.ch (то есть null).

Я думаю, что здесь вам нужен оператор присваивания =.Это присвоит результат read() для demo.ch.

Следующая проблема заключается в том, что похоже, что вы ожидаете, что demo.ch будет Character (в зависимости от используемых вами приведений).Однако вы пытаетесь присвоить ему int (результат read()).Примитивные типы могут быть «автоматически упакованы» при необходимости, то есть они могут быть преобразованы в объект-оболочку, такой как Character или Integer, но только в том случае, если значение, которое нужно преобразовать, является константным выражением, которое может быть представленотип целиЗдесь значение является переменным, поэтому преобразование не может быть выполнено неявно.

Вы можете обойти это, явным образом приведя результат read() к char, а затем разрешив автобоксу преобразовать его вCharacter, но это скрыло бы EOF, который представлен значением -1.Вместо этого я рекомендую использовать что-то вроде этого:

while (true) {
  int ch = System.in.read();
  if ((ch < 0) || (ch == '\n'))
    break;
  if (!s.isFull())
    s.push((char) ch);
 }

Обратите внимание, что здесь мы вообще не используем demo, поэтому проблемы с его параметром type не имеют значения.

1 голос
/ 27 августа 2011

У вас есть == (тест на равенство), когда вы хотите = (назначение). Вы никогда не назначаете на demo.ch. Тест на равенство возвращает логическое значение, а не char, отсюда и сообщение об ошибке.

Вам также нужно будет преобразовать результат из System.in.read() в символ из целого числа (или использовать SampleStack<Integer>, или что-то в этом роде).

1 голос
/ 27 августа 2011

Вы не указали параметр типа при создании экземпляра SampleStack, поэтому demo.ch имеет тип Object.Это, очевидно, нельзя сравнивать (или назначать, что, как я подозреваю, вы на самом деле хотели сделать) из int из System.in.

1 голос
/ 27 августа 2011

SampleStack.ch относится к типу E. E - это объект, указанный параметрами вашего типа. Поскольку вы не указали параметр типа, компилятор добавляет для вас Object. Если бы вы хотели, чтобы ch был Character, вы бы хотели SampleStack<Character> demo = new SampleStack<Character>(); или в Java 7 SampleStack<Character> demo = new SampleStack<>();.

0 голосов
/ 27 августа 2011

У вас есть несколько ошибок в этом коде:

  • как люди указали, что вы создаете общий класс, но вы не обобщаете его и не используете его в необработанном виде, вам необходимо:

    SampleStack<Character>

  • , даже если вы измените его, он не будет работать, как у вас == вместо =

  • даже если вы измените два вышеупомянутых параметра, он не будет работать, поскольку System.in.read () возвращает целое число, а не символ, вам нужно будет либо сделать стек целых чисел, либо прочитать значение из ввода к переменной, а затем приведите ее, но это не очень хорошая практика. Я бы использовал сканер или что-то подобное, чтобы прочитать, что вводит пользователь, как это:

    Scanner sc = new Scanner(System.in); char c = sc.nextChar();

...