传递给泛型构造函数的Java泛型接口存在问题
我有一个接口和一个类,它们都可以很好地编译。 但当我尝试用Namer的匿名实现实例化分隔符时,它无法编译传递给泛型构造函数的Java泛型接口存在问题,java,generics,Java,Generics,我有一个接口和一个类,它们都可以很好地编译。 但当我尝试用Namer的匿名实现实例化分隔符时,它无法编译 private interface Namer<N> { String getName(N o); }; private static class Separator<H> { HashSet<H> oldDiff; HashMap<String, H> newFaMap; public 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.SeparatorSet、Set、MyClass.Namer未定义
我忽略了什么?看起来旧版本和新版本的静态类型已经设置,而不是HashSet。将构造函数的签名更改为:
public Separator(HashSet<H> older, HashSet<H> newer, Namer<H> namer)
到
看起来旧版本和新版本的静态类型是Set而不是HashSet。将构造函数的签名更改为:
public Separator(HashSet<H> older, HashSet<H> newer, Namer<H> namer)
到
我不知道构造函数调用代码中较旧和较新的声明,但是为什么要使用HashSet而不是Separator类中的Set呢?可能旧的和新的被声明为Set?我不知道构造函数调用代码中的旧的和新的声明,但是为什么在Separator类中使用HashSet而不是Set呢?可能较旧和较新的对象被声明为Set?当构造函数参数为HashSet时,较旧和较新的对象似乎是Set类型。当构造函数参数为HashSet时,较旧和较新的对象似乎是Set类型。我非常关注匿名接口,忽略了一个明显的错误。除非你不需要。我太关注匿名界面了,忽略了一个明显的错误。除非你不需要。