导致“不兼容的操作数类型”错误的原因是什么?

时间:2011-08-27 16:40:16

标签: java casting compiler-errors operators type-conversion

我正在尝试通过类实现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 个答案:

答案 0 :(得分:4)

这里有两个与泛型无关的严重问题。

首先,demo.ch == System.in.read()boolean表达式。 read()int)的结果将自动加到Integer,并且该对象的标识将针对demo.ch进行测试({{1} }})。

我认为你想要的是赋值运算符null。这会将=结果分配给read()

接下来的问题是,您希望demo.ch成为demo.ch(基于您正在使用的演员表)。但是,您尝试为其分配Characterint的结果)。原始类型可以在必要时“自动装箱”,也就是说,它们可以转换为包装对象,如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的类型为EE是由类型参数指定的对象。由于您未指定类型参数,因此编译器会为您放入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();