访问外部类引用时java内部类出错

时间:2014-07-23 07:29:58

标签: java eclipse generics inner-classes

我正在实现Trie数据结构。当我使用外部类引用时,我在Eclipse IDE中收到以下错误。

  

该方法比较(捕获超级E的#1 - 捕获超级E的#1 - )   类型比较器不适用于   参数(E,E)

public class Trie<E> implements Collection<E> {

    private Comparator<? super E> comparator;

    private class Entry<E> {        
        private Entry<E> parent;
        private Set<Entry<E>> children;

        private E data;

        Entry(Entry<E> parent, E data){
            this.parent = parent;
            this.data = data;

            parent.addChild(this);
        }

        boolean addChild(Entry<E> child){
            if (children == null)
                children = new TreeSet<Entry<E>>(
                        new Comparator<Entry<E>>() {                            
                            public int compare(Entry<E> o1, Entry<E> o2) {
                                return Trie.this.comparator.compare(o1.data, o2.data);
                            };
                        }
                        );

            return children.add(child);
        }

        boolean removeChild(Entry<E> child){
            boolean result = false;
            if (children != null && children.contains(child)) {
                result = children.remove(child);

                if (children.size() == 0)
                    children = null;
            }

            return result;          
        }
    }
}

如何解决?

Error displaying in Eclipse

1 个答案:

答案 0 :(得分:2)

您在帖子The type parameter E is hiding the type E上遗漏了一条重要警告:private class Entry<E>

内部类E中的类型参数Entry与外部类Trie中的类型参数之间没有关系。您可以在E中将F更改为Entry,您将收到完全相同的错误。

但是,如果您未在类声明<E>中重新定义Entry ,那么它将起作用,因为内部类可以访问外部类的type参数(最初我忘记了)

您需要做的是:仅使用Entry<E> 替换Entry的每一次出现。

public class Trie<E> implements Collection<E> {

    private Comparator<? super E> comparator;

    private class Entry {
        private Entry parent;
        private Set<Entry> children;

        private E data;

        Entry(Entry parent, E data) {
            this.parent = parent;
            this.data = data;

            parent.addChild(this);
        }

        boolean addChild(Entry child) {
            if (children == null)
                children = new TreeSet<Entry>(new Comparator<Entry>() {
                    public int compare(Entry o1, Entry o2) {
                        return Trie.this.comparator.compare(o1.data, o2.data);
                    };
                });

            return children.add(child);
        }

        boolean removeChild(Entry child) {
            boolean result = false;
            if (children != null && children.contains(child)) {
                result = children.remove(child);
                if (children.size() == 0)
                    children = null;
            }
            return result;
        }
    }
}

这会让你的问题消失。