重写Properties.putAll的编译(通用性)问题

时间:2014-12-16 13:13:18

标签: java generics properties

对于我的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循环不能编译,而它似乎等同于第二个

提前致谢!

1 个答案:

答案 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>类型。