Java-访问对象的父对象,涉及泛型?

时间:2011-05-19 16:37:38

标签: java generics

使用下面的代码,我收到编译错误“不兼容的类型 - 找到Tree<T>但预期Tree<T>”。知道我对仿制药做错了什么吗?有没有其他方法来访问ParentObjectClass.this以外的对象的父对象?我知道“变通办法”,比如向Node类添加一个指向其父对象的变量。此外,我可以传递myInt作为构造函数参数,但我想找到一个更好的解决方案。感谢您的任何建议。

我在这个网站上遇到过类似的问题,但是我尝试使用我的代码而无法让它工作:Access "this" from Java anonymous class

public class Tree<T> implements TreeIF<T> {
    private int myInt;
    Node<T> root;

    ...

    // a constructor
    public Tree(Node<T> root) {
        this(root.getTree().getMyInt()); // call to different constructor
        this.root = root;
    }

    ...

    // a method
    public int getMyInt() {
        return myInt;
    }

    ...

    // inner class
    class Node<T> {
        T element;

        ...

        Tree<T> getTree() {
            // return Tree.this;     // I tried this too, but it didn't work
            **return Tree<T>.this;** // HERE'S THE COMPILE ERROR
        }
    }
}

感谢您的建议,Jon。并且,是的,你是对的,Tree类的T与Node类相同。树实际上包含节点,节点包含元素。 Tree类已经知道它使用Node类,因此不需要类型参数。 type参数基本上是一个传递。我只是完全摆脱Tree的类型参数,但是接口(我无法修改)在它的几个方法中返回T,所以它需要知道T是什么。我尝试更改为E并编译...我没有得到相同的错误,但是,我在另一部分遇到错误。我必须根除其他错误,然后看看会发生什么。同时,还有什么进一步的建议吗?

2 个答案:

答案 0 :(得分:5)

你引入了一个新的类型参数,也称为T.如果你改变了这个:

class Node<T>

到此:

class Node<E>

错误会更清楚。但是,我怀疑你实际上想要这个:

class Node

毕竟,节点的T实际上只是树的T,对吧?换句话说,你想要一个(比方说)Tree<String>.Node - 拥有Tree<String>.Node<Object>是没有意义的。

答案 1 :(得分:0)

这有效:

public class Tree<T> {
    private int myInt;
    Node root;

    ...

    // a constructor
    public Tree(Node root) {
        this(root.getTree().getMyInt()); // call to different constructor
        this.root = root;
    }

    ...

    // a method
    public int getMyInt() {
        return myInt;
    }

    ...

    // inner class
    class Node {
        T element;

        Tree<T> getTree() {
            return Tree.this; // leave out <T>
        }
    }
}