不兼容的类型 - SortedSet和TreeSet

时间:2012-06-07 18:27:08

标签: java

当我尝试编译时:

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

3 个答案:

答案 0 :(得分:2)

试试这个:

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

您可以在向其中添加元素时指定地图中值的实际类型,同时您必须使用在声明属性时使用的相同类型(即{{1} }和String)。

例如,在向地图添加新的键/值对时,这将起作用:

SortedSet<Integer>

答案 1 :(得分:1)

始终使用界面而不是具体类型键入对象。所以你应该:

private Map<String, Set<Integer>> table;
而不是你现在拥有的。优点是您可以随时切换实现。

然后:

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

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

答案 2 :(得分:1)

您可以随时声明:

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

但我建议使用:

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

查看this问题