2011-08-22 133 views
1

我正在使用如下所示的以​​下方法創建此堆棧類。通用堆棧方法

import java.util.ArrayList; 
    import java.util.EmptyStackException; 


    public class SortableStack<E extends Comparable<E>> implements ISortableStack<E> { 
     private int N;   
     private Node first;  


     private class Node { 
      private E e; 
      private Node next; 
     } 


     public SortableStack() { 
      first = null; 
      N = 0; 
     } 


    private ArrayList<E> listOne = new ArrayList<E>(); 



    public boolean isEmpty() { 
      return first == null; 
     } 


     public int size() { 
      return N; 
     } 
     public void push(E e) { 
      Node oldfirst = first; 
      first = new Node(); 
      first.e = e; 
      first.next = oldfirst; 
      N++; 
     } 
     public E pop() { 
      if (isEmpty()) throw new RuntimeException("Stack underflow"); 
      E e = first.e;  // save e to return 
      first = first.next;   // delete first node 
      N--; 
      return e;     // return the saved e 
     } 


    public E peekMidElement() { 
     if(listOne.size() <= 0){ 
     throw new EmptyStackException(); 
     } 

     return listOne.get(listOne.size()/2); 
     } 

    public E peekHighestElement() { 
     if(listOne.size() <= 0){ 
     throw new EmptyStackException(); 
     } 

     return listOne.get(listOne.size() - 1); 
     } 

    public E peekLowestElement() { 
     if(listOne.size() <= 0){ 
     throw new EmptyStackException(); 
     } 

     return listOne.get(0); 
     } 
    }` 

//接口ISortableStack是[這裏] [1] (該註釋描述所需的方法簽名)。

[1]:HTTP://stackoverflow.com/questions/7130901/java-stack-implementation

現在,當我嘗試這裏創建主體類:

import java.io.*; 
public class ExhibitStack<E extends Comparable<E> > { 

    E ch; 
    public static void main(String[] args) throws IOException { 
     ISortableStack<E> s = new ISortableStack(5); // Cannot instatiate ISORTABLESTACK 
     ExhibitStack demo = new ExhibitStack(); 
     // Cannot make reference to a non static type 
     while ((demo.ch = (E) System.in.read()) != '\n') { 
      if (!s.full()) { 
       s.push(demo.ch); 
      } 
     } 
     while (!s.empty()) { 
      System.out.print(s.pop()); 
     } 

     System.out.println(); 
    } 
} 

它在ISortableStack中拋出錯誤爲:無法對非靜態類型進行引用。 ,並且無法安裝ISORTABLESTACK

我想用界面創建菜單驅動的程序。我對Java GENERICS和集合很不滿意,並且在提交任務時已經很晚了。 任何幫助/方向將不勝感激。

+0

我想你的意思是寫ISortableStack S =新SortableStack();你在這裏沒有泛型的問題,你不能實例化一個接口。你只能實例化一個ISortableStack的實現。 –

+0

我知道這是一個Q + A網站,任何人都可以自由地提出問題,但是您不會通過讓其他人解決您的任務來學習如何編程。我希望你從這些答案中學習。 –

+1

感謝您回覆Dru。但是,我比其他任何教科書都能從中學到更多。感謝@ZenMaster,@ Mark Peters,甚至你給予了這樣的真知灼見。至於做分配的事情,我很高興,至少我試圖弄清楚自己。 – Yonathan

回答

3
ISortableStack<E> s = new ISortableStack(5); //Cannot instatiate ISORTABLESTACK 

ISortableStack接口(它指定的方法的簽名,但不是進入在這些方法的代碼),因而它本身不能被實例化。相反,嘗試使用您的具體實現類:

ISortableStack<E> s = new SortableStack<E>(); 

現在,ESortableStack類型參數:這對一些特定一個佔位符,就像String。您不需要指定E作爲該類的用戶,您需要告訴編譯器E應該映射到此實例。它看起來像你的籌碼需要持有字符,所以你真正想要的是:

ISortableStack<Character> s = new SortableStack<Character>(); 

char character; 
while ((character = (char)System.in.read()) != '\n') { 
    //... 
    s.push(character); 
} 

你不需要ch是的demo成員。

+0

打我吧:) @Yonathan除了這個,你會遇到一個問題,因爲你沒有一個構造函數接受'int'。 – Shaded

+0

@Shaded:這是一個很好的觀點,我現在要改變它。 –

+0

我確定,我會的。任何建議來改進這個代碼? – Yonathan

0

在該特定行(ISortableStack<E> s = new ISortableStack(5);)有幾件事情正在進行。

讓我們對它們進行排序逐一:

ISortableStack是原始類型。參考通用類型 ISortableStack應參數化

這裏的問題是您正在嘗試使用原始類型。下一步將是參數化的:

無法實例ISortableStack

您正試圖創建一個接口的實例的類型 - 這當然是應該失敗的。改爲使用班級。

不能使靜態參考非靜態類型E

類型參數不能在任何靜態上下文中使用,你的main方法。

除此之外, - 你似乎缺少代碼的部分...