我正在使用以下方法创建此堆栈类。
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 :(得分:3)
ISortableStack<E> s = new ISortableStack(5); //Cannot instatiate ISORTABLESTACK
ISortableStack
是一个接口(它指定方法的签名,但不指定那些方法中的代码),因此它本身不能被实例化。而是尝试使用具体的实现类:
ISortableStack<E> s = new SortableStack<E>();
现在,E
中的SortableStack
是类型参数:它是某些特定类的占位符,例如String
。您需要告诉编译器E
应该为此实例映射的内容,而不是将E
指定为此类的用户。看起来你的堆栈需要保存字符,所以你真正想要的是:
ISortableStack<Character> s = new SortableStack<Character>();
char character;
while ( (character = (char)System.in.read()) != '\n') {
//...
s.push(character);
}
您不需要ch
成为demo
的成员。
答案 1 :(得分:0)
在该特定行(ISortableStack<E> s = new ISortableStack(5);
)处,有几件事情正在发生。
让我们一个一个地解决它们:
ISortableStack是一种原始类型。对泛型类型的引用 应该参数化ISortableStack
这里的问题是你正在尝试使用原始类型。下一步是将其参数化:
无法实例化ISortableStack类型
您正在尝试创建一个接口实例 - 当然应该失败。改为使用一个类。
无法对非静态类型E
进行静态引用
类型参数不能在main
方法所用的任何静态上下文中使用。
除此之外 - 您似乎缺少部分代码......