什么导致“不兼容的操作数类型”错误?
我正试图通过一个类实现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')
错误:不兼容的操作数类型的对象和int
是什么这里错了吗?
SampleStack.ch
的类型是E
。 E
是由您的类型参数指定的对象。由于您没有指定类型参数,因此编译器会为您提供Object
。如果你想ch
是Character
,你会想要SampleStack<Character> demo = new SampleStack<Character>();
或Java 7 SampleStack<Character> demo = new SampleStack<>();
。
你有==
(平等测试),当你想=
(转让)。你从来没有真正分配到demo.ch
。相等性测试返回布尔值,而不是char,因此是错误消息。
您还需要从整从System.in.read()
把结果给一个字符(或者使用SampleStack<Integer>
,或者类似的东西。)
井铸造是一种选择,但有更好的选择,如扫描仪类。 –
您没有提供一个类型参数当实例SampleStack
,所以demo.ch
是Object
的类型。这显然不能与来自System.in
的int
进行比较(或分配,无论如何,这是我怀疑你实际上想要做的事)。
您在这几个代码错误:
-
为人们指出了你正在做一个通用类,但你不能概括它,使用它生的,你需要:
SampleStack<Character>
即使你改变它,它不会跑,你有==而不是=
-
即使昌e上面两个它不会工作,因为System.in.read()返回一个int,而不是一个字符,你需要做一个整数栈,或者从输入值读取一个变量,然后转换它,但它的不是一个好习惯。我会使用一个扫描仪或somethign类似读什么用户输入是这样的:
Scanner sc = new Scanner(System.in); char c = sc.nextChar();
这里有什么都没有做仿制药两次严重的问题。
首先,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
所有,因此其类型参数的问题是无关紧要的。
请注意'Character c; c =(int)3;'确实被定义并且工作得很好。然而,你所说的其余部分听起来很健全,尤其是关于将read()的结果自动装箱到“Character”的危害。 –
@Ernest Friedman-Hill:这很有趣,我没有意识到,但我仍然不完全理解那里发生的事情。看起来这个赋值只有在int变量可以被静态确定为适合'char'而没有变窄的情况下才起作用。例如,'c =(int)-1'和'c =(int)65536'不起作用。此外,分析是局部的; 'int i = 3; c = i;'在这种情况下不起作用。你知道JLS在哪里? – erickson
我认为这在第5.2节“分配转换*”的讨论中已经讨论过了。如果变量的类型是byte,short或char,并且常量表达式的值可以表示,则可以使用缩小的基元转换在变量的类型中。*“ –
,如果你申报演示为'SampleStack'? –
而不是抑制警告(如你用'@SuppressWarnings完成(“未登记”)'),你应该听从编译器的建议。如果你不明白这个建议,那么你应该先读一读,直到你这样做(这就是你在做什么,这是一个很好的选择。)一般来说:*不要忽视警告,除非你知道他们的意思* – dlev
到底什么是排序堆,比一个自相矛盾的其他? – EJP