我有以下Java类(显然没有用):
public class EntrySet<T> {
public static class Entry<T> {
T obj;
}
private final Set<Entry<T>> set;
public EntrySet() {
this.set = Sets.newHashSet();
}
public Set<Entry<T>> getEntries() {
return set;
}
}
给定此类,则不会编译以下内容:
EntrySet<?> entrySet = new EntrySet<SomeClass>();
Set<EntrySet.Entry<?>> entries = entrySet.getEntries();
第二行出现编译错误“无法从
Set<EntrySet.Entry<capture#1-of ?>>
转换为Set<EntrySet.Entry<?>>
”。即使使用强制转换或使用辅助函数,我也找不到消除此错误的方法。这里的问题到底是什么?有没有办法进行干净的编译?
我能做的最好的事情是:
EntrySet<?> entrySet = new EntrySet<SomeClass>();
Set<?> tmp = entrySet.getEntries();
Set<EntrySet.Entry<?>> entries = (Set<EntrySet.Entry<?>>) tmp;
这显然是可怕的(即使有相关的警告抑制)。
最佳答案
删除entrySet
您正试图将Set<EntrySet.Entry<SomeClass>>
分配给Set<EntrySet.Entry<?>>
。实质上有数百个Stack Overflow问题。您可以为后者添加一个EntrySet.Entry<OtherClass>
,但不能为其添加一个,这样会破坏类型安全性。
解决此问题的方法可能是通过调用具有(命名)通用参数的方法来捕获通配符。
EntrySet<?> entrySet = new EntrySet<SomeClass>();
fn(entrySet);
...
private static <T> void fn(EntrySet<T> entrySet) {
Set<EntrySet.Entry<T>> entries = entrySet.getEntries();