2013-02-24 91 views
1

我是新來的Java中的泛型,我真的需要幫助這個代碼 它不編譯我不知道爲什麼!
Stack類是:爲什麼不是這個java代碼工作?!通用堆棧

public class GenericStack<Item>{ 
    public class Stack { 

     private Node first=null; 

     private class Node { 
      Item item; 
      Node next; 
     } 

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

     public void push (Item item) 
     { 
      Node oldfirst = first; 
      first = new Node(); 
      first.item = item; 
      first.next = oldfirst; 
     } 

     public Item pop() 
     { 
      Item item=first.item; 
      first=first.next; 
      return item; 
     } 
    } 
} 

,這裏是主要的

public class Main { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    GenericStack<Integer> ob = new GenericStack<Integer>(); 
    ob.push(5); 
    obpush(10); 
    ob.push(15); 
    while (!ob.IsEmpty()) 
    { 
     int x=ob.pop(); 
     StdOut.print(x); 
    } 

    } 
} 

現在的錯誤是:

The method push(int) isn't defined for the type GenericStack<Integer> 

哪裏我做錯?任何人都可以解釋,請給我

預先感謝您

+3

'GenericStack'沒有'push'方法,只有嵌套的類'Stack'有它。 – toniedzwiedz 2013-02-24 17:07:56

+0

因爲沒有接受int參數的方法,例如push(int)。 – 2013-02-24 17:09:10

+0

我想你正在考慮[Autoboxing](http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html) – 2013-02-24 17:09:55

回答

2
class GenericStack<Item>{ 
    class Stack { 

     private Node first=null; 

     private class Node { 
      Item item; 
      Node next; 
     } 

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

     public void push (Item item) 
     { 
      Node oldfirst = first; 
      first = new Node(); 
      first.item = item; 
      first.next = oldfirst; 
     } 

     public Item pop() 
     { 
      Item item=first.item; 
      first=first.next; 
      return item; 
     } 
    } 
} 

public class Main { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    GenericStack<Integer> ob = new GenericStack<Integer>(); 
    GenericStack<Integer>.Stack st=ob.new Stack(); 
    st.push(5); 
    st.push(10); 
    st.push(15); 
    while (!st.IsEmpty()) 
    { 
     int x=st.pop(); 
//  StdOut.print(x); 
     System.out.println(x); 
    } 

    } 
} 

您正在調用內部類的方法。因此,使用外部類的對象不能直接調用內部類的方法。請參閱上面的代碼。

希望這會有所幫助。

3

GenericStack類沒有方法。擺脫嵌套類結構的,並使用一般類型參數爲Stack直接:

public class Stack<Item> { 

    private Node first=null; 

    private class Node { 
     Item item; 
     Node next; 
    } 

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

    public void push (Item item) 
    { 
     Node oldfirst = first; 
     first = new Node(); 
     first.item = item; 
     first.next = oldfirst; 
    } 

    public Item pop() 
    { 
     Item item=first.item; 
     first=first.next; 
     return item; 
    } 
} 
+0

天啊!這很簡單。謝謝先生 – Coderji 2013-02-24 17:15:08

2

由於方法pushGenericStack.Stack,不GenericStack被定義。爲了使工作更換

GenericStack<Integer> ob = new GenericStack<Integer>(); 

GenericStack<Integer>.Stack ob = new GenericStack.Stack(); 
+0

由於它不是一個靜態的內部類,你需要有一個封閉類的實例。所以你的第二個陳述應該是GenericStack .Stack st = outerClassObject.new Stack(); – ankurtr 2013-02-24 17:24:54

2

的主要問題與您的代碼是你混合2個公開課,只是改變了一點點你的代碼,有樂趣!

GenericStack.java

public class GenericStack<Item> { 

    private Node first = null; 

    private class Node { 
     Item item; 
     Node next; 
    } 

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

    public void push(Item item) { 
     Node oldfirst = first; 
     first = new Node(); 
     first.item = item; 
     first.next = oldfirst; 
    } 

    public Item pop() { 
     Item item = first.item; 
     first = first.next; 
     return item; 
    } 

} 

TestGenericStack.java

public class TestGenericStack { 

    public static void main(String[] args) { 

     GenericStack<Integer> ob = new GenericStack<Integer>(); 
     ob.push(5); 
     ob.push(10); 
     ob.push(15); 
     while (!ob.IsEmpty()) { 
      int x = ob.pop(); 
      System.out.println(x); 
     } 

    } 
} 
1

得到GenericStack擺脫Stack類的額外塗層。

謝謝!

+0

這是不必要的。畢竟,Java中有[autoboxing](http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html)這樣的東西。 – 2013-02-24 17:23:48

+0

感謝您的更正... :) – 2013-02-24 17:31:13

+0

這不僅是不必要的,而且它也浪費了內存。 'new Integer(5)'創建一個新的對象,而'Integer.valueOf(5)'或者只是'5'都允許重用現有的'Integer'實例。 – toniedzwiedz 2013-02-24 18:11:59

相關問題