1

Javaのgenricsに関して(おそらく単純な)質問があります。私は次のクラスを持っています:

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>>は、コンパイラに、任意のキータイプと値タイプのエントリのセットを意味するVことを納得させる方法でを生成します。

于 2012-07-26T20:16:41.877 に答える