当我尝试编译时:
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>>();
}
}
答案 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>>();
您收到编译时错误,因为SortedSet
和TreeSet
是不同的类型,尽管它们实现了相同的接口(Set
)。
答案 2 :(得分:1)
您可以随时声明:
private SortedMap<String, ? extends SortedSet<Integer>> table;
但我建议使用:
private Map<String, ? extends Set<Integer>> table; // or without '? extends'
查看this问题