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>>();

您可以在添加元素时指定映射中值的实际类型,同时必须使用与声明属性时相同的类型(即StringSortedSet<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>>();

你会得到一个编译时错误,因为SortedSetTreeSet是不同的类型,尽管它们实现了相同的接口 ( Set)。

于 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 回答