【问题标题】:Stack - unchecked/unsafe operations堆栈 - 未经检查/不安全的操作
【发布时间】:2014-02-05 02:26:34
【问题描述】:

所以我在这里尝试运行这个简单的程序:

import java.util.*;

class StackDemo
{
    public static void main(String[] args) {
        Stack s = new Stack();
        s.push(5);
        s.push("dog");
        System.out.print(s);
    }
}

StackDemo.java 使用未经检查或不安全的操作。 注意:使用-Xlint:unchecked 重新编译以获取详细信息。 处理完成。

它显示了预期的结果,即"[5, dog]",但我不理解“构建输出”窗口上的该消息。 这里可能有什么问题?

【问题讨论】:

  • 您是否尝试使用-Xlint:unchecked 进行编译以获取更多详细信息?
  • 这是因为你没有使用泛型。要摆脱警告,您需要像Stack<Object> s = new Stack<>(); 一样声明您的堆栈。但是混合动物和算术是一个奇怪的想法。
  • @JonSkeet 这是一般性建议(根据 Javadoc),只是评论而非答案。
  • @Puce:但我认为目前这实际上并没有帮助。如果您处于不了解泛型的阶段,那么 Deque 与 Stack 的优势并不是真正的主要问题,IMO。
  • @Puce:我认为至少值得明确说明您的评论与用户面临的问题完全无关。

标签: java stack compiler-warnings


【解决方案1】:

Stack 是一个遗留类,但警告是因为您没有使用泛型,编译器无法检查您是否添加了正确的类型。

鉴于您混合了类型,在实际程序中我希望这是错误。

【讨论】:

  • 上面的代码不是一个真正的程序,只是一个示例,可以更快地显示我正在尝试处理的内容,但感谢您的回答
  • 为什么 Stack 是一个遗留类?我应该改用什么?
  • Stack 在 1998 年在很大程度上被 ArrayList 和 LinkedList 取代,但更好的选择是 2006 年添加的 ArrayDeque 或 ConcurrentLinkedDeque。
【解决方案2】:

Stack 是一个泛型类,如果您愿意,可以使用它来存储特定类型的对象(例如,Stack<String> 将用于存储字符串)。使用没有类型说明符的裸类通常被认为是一种不好的做法,因为您会失去集合的类型安全性。

如果确实存在一个用例,您希望在堆栈中同时存储 5"dog",则应使用两者之间的最大公分母 - Object 来定义堆栈:

Stack<Object> s = new Stack<>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多