我有以下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();

10-07 18:53