2011-08-27 57 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,並且常量表達式的值可以表示,則可以使用縮小的基元轉換在變量的類型中。*「 –