gpt4 book ai didi

java - Java 中的泛型特化

转载 作者:行者123 更新时间:2023-12-04 20:50:59 30 4
gpt4 key购买 nike

谁能解释一下,为什么下一个代码没有编译?
我正在为它创建一个部分专用的 Map 和 Map.Entry:

public class Trie<T> implements Map<String, T> {
private class TrieEntry<S> implements Map.Entry<String, S> {
// stupid implementation here
}
// uninterested code here
}

这里一切正常,但我正在实现 entrySet() 方法:

public Set<java.util.Map.Entry<String, T>> entrySet() {
Set<java.util.Map.Entry<String, T>> x = new HashSet<TrieEntry<T>>();
// some uninterested code here
}

eclipse 说

“类型不匹配:无法从 HashSet<Trie<T>.TrieEntry<T>> 转换为 Set<Map.Entry<String,T>>

所以,在我看来TrieEntry<T>应该展开到 Map.Entry<String, T>并且符合定义中的表达式。

我哪里错了?

最佳答案

你是对的 TrieEntry<T>Map.Entry<String, T> . HashSet<TrieEntry<T>>也是一个Set<TrieEntry<T>> , 但它不是 Set<Map.Entry<String, T>> .

如果是的话你可以这样做:

Set<TrieEntry<T>> trieSet = ...;
Set<Map.Entry<String, T>> mapSet = trieSet;
mapSet.add(mapEntry);

所以现在 trieSet 将包含一个 Map.Entry<String, T> !这会破坏泛型。

那么如何解决这个特殊问题呢?简单 - 使用有界通配符:

Set<? extends Map.Entry<String, T>> x = new HashSet<TrieEntry<T>>();

您可以阅读 ? extends Map.Entry<String, T>作为“任何至少是 Map.Entry<String, T> 的东西”。


好的,现在解决您的实现问题。实际上,我相信,由于方法 entrySet() 的当前定义,这是无法解决的。它应该返回? extends Map.Entry<String, T> ,但它确实返回Map.Entry<String, T> .

实际上有一个bug report (或功能请求)正是针对此问题。查看提交日期和优先级,预计不会很快得到修复。

所以你有两个选择:

  1. 放下你的 TrieEntry类并尝试使用 Map.Entry相反,将信息存储在您的键和/或值中。

  2. 放下Map界面并让您自定义entrySet方法返回 ? extends Map.Entry<String, T> .

这两种解决方案可能都不理想,并且可能有更好的解决方案,但这就是我目前能告诉你的全部。

关于java - Java 中的泛型特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066286/

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