Java-未选中从对象到映射的强制转换;字符串,字符串>;

Java-未选中从对象到映射的强制转换;字符串,字符串>;,java,casting,hashtable,Java,Casting,Hashtable,我在“Map.Entry=(Entry)o;”上有一个“unchecked cast from Object to Map.Entry” 我认为一切都很好,我可以安全地添加一个add-suppress警告,但我不确定。这是我的密码 public abstract class WebPath { protected Hashtable<String, String> wp; public String get(String whatDoYouWant) {

我在“Map.Entry=(Entry)o;”上有一个“unchecked cast from Object to Map.Entry”

我认为一切都很好,我可以安全地添加一个add-suppress警告,但我不确定。这是我的密码

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;
    }
}
公共抽象类网页{
受保护哈希表;
公共字符串get(字符串whatDoYouWant){
对于(对象o:wp.entrySet()){
Map.Entry=(Entry)o;
if(whatDoYouWant.equals(entry.getKey())){
return(String)entry.getValue();
}
}
返回null;
}
}

谢谢大家,祝你们今天愉快

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

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

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

wp.entrySet()将返回一组Map.Entry。因此,请使用Map.Entry!如果不删除泛型类型,则更好,因此您应该:

for(Map.Entry:wp.entrySet()){
// ...
}

无需强制转换,因为您知道它是什么类型。

BTW Hashtable是一个在1998年被替换的遗留类。仅当您有需要该类的API时才使用该类。请改用
Map
。特别是
HashMap
,如果您需要哈希表实现。此外,您的return语句中有一个冗余强制转换,例如
entry
已键入,编译器已经知道
entry.getValue()
返回一个
字符串
。我不确定这是输入错误还是误解,但编译器不在乎是否强制转换为超类。这总是安全的。这里的问题是,它是未经检查的强制转换,因此在运行时不会像正常的向下转换那样强制选择类型参数
(即,对于子类,而不是超类)。@MarkPeters Oops,我的意思是编写派生类,而不是超类。问题不在于泛型。如果删除泛型并尝试将对象强制转换为条目,则会出现同样的问题。