我有一个编译错误,让我有点困惑。它说:
TTTree
public abstract class TTTree<K extends Comparable<K>, V> {
public abstract TTTree<K, V> put(K k, V v);
private static <K extends Comparable<K>, V> TTTree<K, V> leaf(K k, V v) { return null; }
private static class Leaf<K extends Comparable<K>, V> extends TTTree<K, V> {
private final K k = null;
private final V v = null;
@Override
public TTTree<K, V> put(K ik, V iv) {
TTTree<K, V> newLeaf = leaf(ik, iv);
return node(newLeaf, k, this); // <---- !!!! ERROR !!!!
}
};
private TTTree<K, V> node(TTTree<K, V> l, K k, TTTree<K, V> r) {
return null;
}
}
似乎这应该可以工作,那么为什么编译器不喜欢它呢?我可以做些什么来修复错误(我想我可以将所有内容转换为原始类型,但这有点太激烈了)。
PS:示例代码减少到最小值,同时仍然产生错误。
PS2:使用Java8编译器编译。
public abstract class TTTree<K extends Comparable<K>, V> {
public abstract TTTree<K, V> put(K k, V v);
private static <K extends Comparable<K>, V> TTTree<K, V> leaf(K k, V v) { return null; }
private static class Leaf<K extends Comparable<K>, V> extends TTTree<K, V> {
private final K k = null;
private final V v = null;
@Override
public TTTree<K, V> put(K ik, V iv) {
TTTree<K, V> newLeaf = leaf(ik, iv);
return node(newLeaf, k, this); // <---- !!!! ERROR !!!!
}
};
private static <K extends Comparable<K>,V> TTTree<K, V> node(TTTree<K, V> l, K k, TTTree<K, V> r) {
return null;
}
}
Leaf是一个嵌套的静态类。它对TTTree及其泛型类型一无所知。此外,Leaf::put方法调用TTTree::节点方法,该方法不是静态的,而是属于某个TTTree实例。当您调用Leaf::put时,没有指向您调用节点方法的TTTree实例的链接。因此方法TTTree::节点应该是静态的。最后一件事:由于TTTree::节点是静态的,您应该声明与Leaf类中使用的相同的类型边界