2011-08-27 119 views
1

我正试图通过一个类实现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

是什么这里错了吗?

+1

,如果你申报演示为'SampleStack '? –

+1

而不是抑制警告(如你用'@SuppressWarnings完成(“未登记”)'),你应该听从编译器的建议。如果你不明白这个建议,那么你应该先读一读,直到你这样做(这就是你在做什么,这是一个很好的选择。)一般来说:*不要忽视警告,除非你知道他们的意思* – dlev

+2

到底什么是排序堆,比一个自相矛盾的其他? – EJP

回答

1

SampleStack.ch的类型是EE是由您的类型参数指定的对象。由于您没有指定类型参数,因此编译器会为您提供Object。如果你想chCharacter,你会想要SampleStack<Character> demo = new SampleStack<Character>();或Java 7 SampleStack<Character> demo = new SampleStack<>();

1

你有==(平等测试),当你想=(转让)。你从来没有真正分配到demo.ch。相等性测试返回布尔值,而不是char,因此是错误消息。

您还需要从整从System.in.read()把结果给一个字符(或者使用SampleStack<Integer>,或者类似的东西。)

+0

井铸造是一种选择,但有更好的选择,如扫描仪类。 –

1

您没有提供一个类型参数当实例SampleStack,所以demo.chObject的类型。这显然不能与来自System.inint进行比较(或分配,无论如何,这是我怀疑你实际上想要做的事)。

0

您在这几个代码错误:

  • 为人们指出了你正在做一个通用类,但你不能概括它,使用它生的,你需要:

    SampleStack<Character>

  • 即使你改变它,它不会跑,你有==而不是=

  • 即使昌e上面两个它不会工作,因为System.in.read()返回一个int,而不是一个字符,你需要做一个整数栈,或者从输入值读取一个变量,然后转换它,但它的不是一个好习惯。我会使用一个扫描仪或somethign类似读什么用户输入是这样的:

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

4

这里有什么都没有做仿制药两次严重的问题。

首先,demo.ch == System.in.read()boolean表达式。 read()(一个int)的结果将被自动装箱到Integer,并且该对象的身份将针对demo.ch(即null)进行测试。

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

下一个问题是,它看起来像你期望demo.ch是一个Character(根据你使用的演员阵容)。但是,你要转让的int(的read()结果)它。原语类型可以是“自动盒装”在必要时,也就是说,它们可以被转换为一个包装对象像CharacterInteger,但只有当要转换的值是可以由所述目标类型来表示一个常量表达式。这里的值是可变的,所以转换不能隐式执行。

你可以变通的作法是明确铸造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所有,因此其类型参数的问题是无关紧要的。

+0

请注意'Character c; c =(int)3;'确实被定义并且工作得很好。然而,你所说的其余部分听起来很健全,尤其是关于将read()的结果自动装箱到“Character”的危害。 –

+0

@Ernest Friedman-Hill:这很有趣,我没有意识到,但我仍然不完全理解那里发生的事情。看起来这个赋值只有在int变量可以被静态确定为适合'char'而没有变窄的情况下才起作用。例如,'c =(int)-1'和'c =(int)65536'不起作用。此外,分析是局部的; 'int i = 3; c = i;'在这种情况下不起作用。你知道JLS在哪里? – erickson

+1

我认为这在第5.2节“分配转换*”的讨论中已经讨论过了。如果变量的类型是byte,short或char,并且常量表达式的值可以表示,则可以使用缩小的基元转换在变量的类型中。*“ –