gpt4 book ai didi

java - 编译(通用性)问题覆盖 Properties.putAll

转载 作者:行者123 更新时间:2023-11-30 11:11:11 26 4
gpt4 key购买 nike

对于我的 JavaFX UI,我实现了一个类 ObservableProperties延伸 java.util.Properties并能够监听某些属性的变化(特别是 UI 的本地化文本)。

它工作得很好,但现在我想覆盖 putAll方法,我对此有一些问题。

首先,作为Properties extends Hashtable<Object,Object> ,我希望能够覆盖

@Override
public void putAll(Map<Object,Object> that)

但是编译不允许我(说我没有覆盖 super 方法),所以我必须使用

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

提前致谢!

最佳答案

您的 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 .通过 Map<String,String>例如会给出错误。

第一个 for 循环无法编译,因为 that.entrySet()有效地返回一组类型 Set<Object> . for 循环不会为您从 Object 转换为 Map.Entry。

第二个循环有效,但带有类型安全警告,因为您告诉编译器该集合的类型为 Set<Map.Entry>在将其传递给 for 循环之前。

关于java - 编译(通用性)问题覆盖 Properties.putAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27505482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com