我正在尝试通过类实现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
这里有什么问题?
答案 0 :(得分:4)
这里有两个与泛型无关的严重问题。
首先,demo.ch == System.in.read()
是boolean
表达式。 read()
(int
)的结果将自动加到Integer
,并且该对象的标识将针对demo.ch
进行测试({{1} }})。
我认为你想要的是赋值运算符null
。这会将=
结果分配给read()
。
接下来的问题是,您希望demo.ch
成为demo.ch
(基于您正在使用的演员表)。但是,您尝试为其分配Character
(int
的结果)。原始类型可以在必要时“自动装箱”,也就是说,它们可以转换为包装对象,如read()
或Character
,但仅当要转换的值是一个常量表达式时才能由目标类型表示。这里的值是可变的,因此无法隐式执行转换。
您可以通过将Integer
结果明确地转换为read()
,然后让自动装箱将其转换为char
来解决此问题,但这会隐藏EOF,由值-1表示。我建议改用这样的东西:
Character
请注意,我们根本不使用while (true) {
int ch = System.in.read();
if ((ch < 0) || (ch == '\n'))
break;
if (!s.isFull())
s.push((char) ch);
}
,因此其类型参数的问题无关紧要。
答案 1 :(得分:1)
SampleStack.ch
的类型为E
。 E
是由类型参数指定的对象。由于您未指定类型参数,因此编译器会为您放入Object
。如果您希望ch
成为Character
,则需要SampleStack<Character> demo = new SampleStack<Character>();
或Java 7 SampleStack<Character> demo = new SampleStack<>();
。
答案 2 :(得分:1)
当您需要==
(作业)时,您有=
(相等测试)。你实际上从未真正分配给demo.ch
。相等测试返回boolean而不是char,因此返回错误消息。
您还需要将System.in.read()
的结果转换为整数中的字符(或者使用SampleStack<Integer>
或类似的东西。)
答案 3 :(得分:1)
实例化SampleStack
时未提供类型参数,因此demo.ch
的类型为Object
。这显然无法与来自int
的{{1}}进行比较(或分配,这是我怀疑你真正想做的事情)。
答案 4 :(得分:0)
此代码中有几个错误:
正如人们指出你正在制作一个通用类,但是你没有将它概括为一般并且使用它,你需要:
SampleStack<Character>
即使你改变它也不会运行,因为你有==而不是=
即使你改变了上面的两个它也不会工作,因为System.in.read()返回一个int,而不是一个字符,你需要创建一个Integers堆栈或者从输入中读取值一个变量,然后施放它,但这不是一个好习惯。我会使用扫描仪或类似的东西来读取用户输入的内容:
Scanner sc = new Scanner(System.in);
char c = sc.nextChar();