【问题标题】:Stack with type parameters in Java堆栈与 Java 中的类型参数
【发布时间】:2020-07-27 18:29:10
【问题描述】:

我正在尝试让堆栈在接近最新的 Java (Java 13) 时工作​​。

类似:

Stack<String> stack = new Stack<String>();  

我得到的错误信息是

类型Stack不带参数

但是,我在网上看到的所有例子都是带参数的。

我应该如何构建(非原始)堆栈?

=====++=========

附录:

所以,我通过导入让它正常工作:

导入 java.util.Stack;

这很奇怪,因为我已经有一个导入:

导入 java.util.*;

无论如何,我不会费心去进一步弄清楚它,因为它现在可以工作了。

【问题讨论】:

  • 那是您的确切代码吗?或者你在做类似... = new Stack&lt;String&gt;(someObject);
  • 首先,Stack&lt;&gt; 是库类还是你自己的代码?此外,从 Java 7 开始,您不必在构造函数中指定泛型参数,因为它们可以被推断出来。我不知道 Java 13 有那么好,但是如果使用泛型参数不仅没用,而且在这个版本中也被禁止了怎么办?无论如何,我会尝试改用new Stack&lt;&gt;()
  • 1) 确保您导入了java.util.Stack,而不是其他一些堆栈实现,并且您还没有创建自己的名为Stack 的类。 --- 2) Stack 的javadoc 建议你使用Deque / ArrayDeque 代替("Deque interface and its implementations should be used in preference to Stack").
  • 请提供minimal reproducible example,我们可以复制/粘贴并得到您所询问的相同错误。
  • Java 13 javadoc for Stack 确认它仍然是现代 Java 中的参数化类。假设我们使用的是 java.util.Stack 而不是其他任意实现。

标签: java generics stack


【解决方案1】:

我不会和图书馆混在一起,因为无论您做什么,通常都需要一些特殊的需求。做一个专门做你想做的事情的堆栈要好得多,而不是试图锤击一个库来把它欺负成一个有用的形状。下面是 Java 中堆栈的典型实现。它目前设置为保存整数,但如果我想保存字符串,那么我只需调整它。

public class Utility_Stack {
    final static int DEFAULT_Capacity = 1000;
    int capacity = 1000;
    int xTop = 0;
    String[] aString;
    int[] aInt;
    double[] aDouble;
    private Utility_Stack(){}
    public static Utility_Stack create(){
        Utility_Stack stack = new Utility_Stack();
        stack.aInt = new int[ DEFAULT_Capacity ];
        return stack;
    }
    public void push( int item ){
        xTop++;
        if( xTop >= capacity ){
            int iNewCapacity = capacity * 7 / 5;
            int[] new_stack = new int[ iNewCapacity + 1 ];
            System.arraycopy( aInt, 0, new_stack, 0, aInt.length );
            aInt = new_stack;
            capacity = iNewCapacity;
        }
        aInt[ xTop ] = item;
    }
    public int peek(){ return aInt[ xTop ]; }
    public int pop(){
        int top = aInt[ xTop ];
        aInt[ xTop ] = Integer.MIN_VALUE;
        if( xTop > 0 ) xTop--;
        return top;
    }
    public void reset(){ xTop = 0; }
    public boolean isEmpty(){ return xTop == 0; }
}

【讨论】:

  • 你说的“玩图书馆”是什么意思?您是否建议我们避免修改标准 Java API 类?还是您建议我们避免使用标准 Java API 中的类并编写我们自己的类?
  • 考虑到非标准命名约定、不正确的大小写、非私有变量、缺少参数化类型、变量名不明确等,这看起来不像任何类型的“典型”Java 实现.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2016-02-11
  • 2011-03-04
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多