对于我的JavaFX UI,我实现了一个扩展ObservableProperties
的类java.util.Properties
,并且可以监听某些属性的更改(特别是UI的本地化文本)。
它工作得很好,但现在我想覆盖putAll
方法,我遇到了一些问题。
首先,作为Properties extends Hashtable<Object,Object>
,我希望能够覆盖
@Override
public void putAll(Map<Object,Object> that)
但编译不会让我(说我没有覆盖超级方法),所以我必须使用
@Override
public void putAll(Map that)
我想对that
的条目执行操作,所以我像往常一样尝试
for (Map.Entry entry : that.entrySet())
但编译器告诉我类型不匹配:无法从元素类型Object转换为Map.Entry 。但是,有了第二个片段
Set<Map.Entry> set = that.entrySet();
for (Map.Entry a : set);
它编译......
总结一下,我想知道:
Map<K,V>
的范围
for
循环不能编译,而它似乎等同于第二个提前致谢!
答案 0 :(得分:1)
你有putAll方法的签名错误。要从Hasttable覆盖方法,签名必须匹配,因此它应该是:
@Override
public synchronized void putAll(Map<? extends Object, ? extends Object> t) {
}
? extends Object
允许您将任何类型的Map传递给方法。如果签名只是putAll(Map<Object,Object> t)
,那么您只能传递Map<Object,Object>
类型的地图。例如,传递Map<String,String>
会出错。
第一个for循环不会编译,因为that.entrySet()
实际上返回了一组类型Set<Object>
。 for循环不会从Object转换为Map.Entry。
第二个循环有效,但是有类型安全警告,因为在将集合传递给for循环之前,你告诉编译器该集合是Set<Map.Entry>
类型。