1

我有一个关于 Java 泛型的(可能很简单)问题。我有以下课程:

public class ValueCollection<Y> implements Collection<Y>
{
    private Set<Entry<?, Y>> entries;

    public ValueCollection(Set<Entry<?, Y>> entries)
    {
        this.entries = entries;
    }
    ...
}

当我这样调用构造函数时:

return new ValueCollection<V>(entries);

我收到以下编译器错误:

The constructor ValueCollection<V>(Set<Map.Entry<K,V>>) is undefined

如果我把我的班级改成这样:

public class ValueCollection<X, Y> implements Collection<Y>
{
    private Set<Entry<X, Y>> entries;

    public ValueCollection(Set<Entry<X, Y>> entries)
    {
        this.entries = entries;
    }
    ...
}

我的构造函数调用这个:

return new ValueCollection<K, V>(this.entries());

编译错误消失了。我只是想知道为什么会这样。谢谢您的帮助!

4

1 回答 1

2

ASet<Entry<?, V>>一组具有任何键类型和值类型V的条目,或者是一组具有某些特定但未知的键类型K和值类型V的条目。由于后者,编译器拒绝您原来的构造函数调用。

ASet<? extends Entry<?, V>>一组条目,它们是具有任何键类型和值类型的条目V。这正是您想要的,将您的构造函数参数类型重新定义为Set<? extends Entry<?, V>>.

this.entries = Collections.unmodifiableSet(entries)您可以使用或将参数分配给您的字段this.entries = new HashSet<Entry<?, V>>(entries)。右手边都Set<Entry<?, V>>以某种方式生成 a 以使编译器相信它意味着一组具有任何键类型和值类型的条目V

于 2012-07-26T20:16:41.877 回答