传递给泛型构造函数的Java泛型接口存在问题

传递给泛型构造函数的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(

我有一个接口和一个类,它们都可以很好地编译。 但当我尝试用Namer的匿名实现实例化分隔符时,它无法编译

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类型。

我非常关注匿名接口,忽略了一个明显的错误。除非你不需要。我太关注匿名界面了,忽略了一个明显的错误。除非你不需要。