提问者:小点点

有人能解释一下这个“无法转换”Java泛型错误吗?[重复]


我有一个编译错误,让我有点困惑。它说:

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编译器编译。


共1个答案

匿名用户

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类中使用的相同的类型边界