【问题标题】:Java - Unchecked cast from Object to Map.Entry<String,String>Java - 从 Object 到 Map.Entry<String,String> 的未经检查的强制转换
【发布时间】:2016-02-08 16:02:59
【问题描述】:

我在“Map.Entry entry = (Entry) o;”上有一个“从 Object 到 Map.Entry 的未经检查的强制转换”

我认为一切正常,我可以安全地添加抑制警告,但我不确定。这是我的代码。

public abstract class WebPath {
    protected Hashtable<String, String> wp;

    public String get(String whatDoYouWant) {
        for (Object o : wp.entrySet()) {

            Map.Entry<String, String> entry = (Entry<String, String>) o;
            if (whatDoYouWant.equals(entry.getKey())) {
                return (String) entry.getValue();
            }
        }

        return null;
    }
}

谢谢大家,祝你有个美好的一天!

【问题讨论】:

  • BTW Hashtable 是一个在 1998 年被替换的遗留类。只有当你有一个需要它的 API 时才使用这个类。请改用Map
  • 如果你想要一个哈希表实现,特别是HashMap。此外,您的 return 语句中有一个多余的转换,因为您的 entry 被键入,编译器已经知道 entry.getValue() 返回一个 String

标签: java casting hashtable


【解决方案1】:

不要压制警告,它会给你很好的建议!您选择将每个条目分配给无信息基类Object,而不是更精确的类型Map.Entry&lt;String, String&gt;。如果你修复你的 for 循环,你将消除警告:

for(Map.Entry<String, String> o : wp.entrySet()) {

【讨论】:

    【解决方案2】:

    编译器不喜欢将实例转换为派生类。这是因为您无法保证该实例 派生类。如果您对自己的情况了解得更好,那很好,但一般来说这不是最佳实践。

    您的 wp.entrySet() 正在返回一组 Map.Entry。所以使用 Map.Entry!如果您不删除泛型类型,那就更好了,所以您应该:

    for(Map.Entry<String, String> entry : wp.entrySet()) {
        // ...
    }
    

    不需要强制转换,因为你知道它是什么类型。

    【讨论】:

    • 我不确定这是拼写错误还是误解,但如果您转换为超类,编译器不会在意。那总是安全的。这里的问题是它是一个 unchecked 强制转换,因此类型参数 &lt;String, String&gt; 的选择不会像正常的向下强制转换那样在运行时强制执行(即到子类,而不是超类)。
    • @MarkPeters 哎呀,我的意思是写派生类,而不是超类。问题不在于泛型。如果您删除泛型并尝试将 Object 强制转换为 Entry,它会给您同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多