This question already has answers here:
Is an enum constant-specific class body static or non-static?

(8个答案)


4年前关闭。




我遇到了一个编译错误,这让我有些困惑。它说:

不能在下面标记的代码行将TTTree<K,V>转换为TTTree<K,V>
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:使用Java 8编译器进行编译。

最佳答案

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::node方法,该方法不是静态的,但属于某些TTTree实例。在您调用Leaf::put时,没有指向您正在调用node方法的TTTree实例的链接。这样TTTree::node方法应该是静态的。最后一件事:由于TTTree::node是静态的,因此您应该声明与Leaf类中相同的类型范围

10-06 06:32