Здесь есть две серьезные проблемы, которые не имеют ничего общего с генериками.
Во-первых, 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 не имеют значения.