This question already has answers here:
Is an enum constant-specific class body static or non-static?
(8个答案)
4年前关闭。
我遇到了一个编译错误,这让我有些困惑。它说:
不能在下面标记的代码行将
似乎这样应该可以,为什么编译器不喜欢它呢?我该怎么做才能纠正错误(我想我可以将所有内容都转换为原始类型,但这有点太过激了)。
PS:示例代码减少到“最小裸露”,同时仍然产生错误。
PS2:使用Java 8编译器进行编译。
Leaf是一个嵌套的静态类。它对TTTree及其通用类型一无所知。此外,Leaf::put方法将调用TTTree::node方法,该方法不是静态的,但属于某些TTTree实例。在您调用Leaf::put时,没有指向您正在调用node方法的TTTree实例的链接。这样TTTree::node方法应该是静态的。最后一件事:由于TTTree::node是静态的,因此您应该声明与Leaf类中相同的类型范围
(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