传递给Generic Constructor的Java通用接口问题

时间:2011-02-17 22:52:25

标签: java generics

我有一个接口和一个类,并且编译都很好。 但是当我尝试使用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>)未定义

我忽略了什么?

3 个答案:

答案 0 :(得分:3)

看起来oldernewer的静态类型是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)

我不知道构造函数调用代码中oldernewer的声明,但是为什么在HashSet中使用Set代替Separator类?也许oldernewer被声明为Set

答案 2 :(得分:0)

当构造函数参数为“HashSet”时,旧的和​​较新的对象似乎是“Set”类型。