我有一个接口和一个类,并且编译都很好。 但是当我尝试使用Namer的匿名实现来实例化一个Separator时,它无法编译。
private interface Namer<N>
{
String getName(N o);
};
private static class Separator<H>
{
HashSet<H> oldDiff;
HashMap<String, H> newFaMap;
public Separator(HashSet<H> older, HashSet<H> newer, Namer<H> namer)
{
oldDiff = new HashSet<H> (older);
HashSet<H> newDiff = new HashSet<H> (newer);
oldDiff.removeAll(newer);
newDiff.removeAll(older);
newFaMap = makeMap(newDiff, namer);
}
private HashMap<String, H> makeMap(HashSet<H> set, Namer<H> namer)
{
HashMap<String, H> map = new HashMap<String, H>();
for (H holder : set)
{
map.put(namer.getName(holder), holder);
}
return map;
}
}
在方法
中 Namer<FAHolder> namer = new Namer<FAHolder>() {
public String getName(FAHolder o)
{
return o.getName();
}
};
new Separator<FAHolder>(older, newer, namer);
编译错误是:
构造函数
MyClass.Separator<FAHolder>(Set<FAHolder>, Set<FAHolder>, MyClass.Namer<FAHolder>)
未定义
我忽略了什么?
答案 0 :(得分:3)
看起来older
和newer
的静态类型是Set<FAHolder>
而不是HashSet<FAHolder>
。从以下位置更改构造函数的签名:
public Separator(HashSet<H> older, HashSet<H> newer, Namer<H> namer)
到
public Separator(Set<H> older, Set<H> newer, Namer<H> namer)
答案 1 :(得分:2)
我不知道构造函数调用代码中older
和newer
的声明,但是为什么在HashSet
中使用Set
代替Separator
类?也许older
和newer
被声明为Set
?
答案 2 :(得分:0)
当构造函数参数为“HashSet”时,旧的和较新的对象似乎是“Set”类型。