- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谁能解释一下,为什么下一个代码没有编译?
我正在为它创建一个部分专用的 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 (或功能请求)正是针对此问题。查看提交日期和优先级,预计不会很快得到修复。
所以你有两个选择:
放下你的 TrieEntry
类并尝试使用 Map.Entry
相反,将信息存储在您的键和/或值中。
放下Map
界面并让您自定义entrySet
方法返回 ? extends Map.Entry<String, T>
.
这两种解决方案可能都不理想,并且可能有更好的解决方案,但这就是我目前能告诉你的全部。
关于java - Java 中的泛型特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066286/
我是一名优秀的程序员,十分优秀!