使用下面的代码,我收到编译错误“不兼容的类型 - 找到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并编译...我没有得到相同的错误,但是,我在另一部分遇到错误。我必须根除其他错误,然后看看会发生什么。同时,还有什么进一步的建议吗?
答案 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>
}
}
}