2

これをコンパイルしようとすると:

import java.util.*;

public class NameIndex
{
    private SortedMap<String,SortedSet<Integer>> table;

    public NameIndex()
    {
        this.table = new TreeMap<String,TreeSet<Integer>>();
    }
}

私は得る:

Incompatible types - found java.util.TreeMap<java.lang.String,java.util.TreeSet<java.lang.Integer>> but expected java.util.String,java.util.SortedSet<java.lang.Integer>>

理由はありますか?

更新:これはコンパイルされます:

public class NameIndex
{
    private SortedMap<String,TreeSet<Integer>> table;

    public NameIndex()
    {
        this.table = new TreeMap<String,TreeSet<Integer>>();
    }
}
4

3 に答える 3

2

これを試して:

this.table = new TreeMap<String, SortedSet<Integer>>();

要素をマップに追加するときに、マップ内の値の実際の型を指定できますが、属性を宣言するときに使用したのと同じ型を使用する必要があります (つまりString、 とSortedSet<Integer>)。

たとえば、これは新しいキーと値のペアをマップに追加するときに機能します。

table.put("key", new TreeSet<Integer>());
于 2012-06-07T18:29:56.667 に答える
1

具象型ではなく、常にインターフェイスを使用してオブジェクトを型付けしてください。したがって、次のものが必要です。

private Map<String, Set<Integer>> table;

あなたが今持っているものの代わりに。利点は、必要なときにいつでも実装を切り替えることができることです。

それで:

this.table = new TreeMap<String, Set<Integer>>();

とは同じインターフェイス ( ) を実装していますが、型が異なるため、コンパイル時にエラーが発生しSortedSetます。TreeSetSet

于 2012-06-07T18:30:11.323 に答える
1

いつでも宣言できます:

private SortedMap<String, ? extends SortedSet<Integer>> table;

しかし、私は使用することをお勧めします:

private Map<String, ? extends Set<Integer>> table; // or without '? extends'

この質問を見て

于 2012-06-07T18:31:44.583 に答える