作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个编译错误,这让我有点困惑。它说:
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 时,没有指向您调用节点方法的 TTTree 实例的链接。因此 TTTree::node 方法应该是静态的。最后一件事:由于 TTTree::node 是静态的,因此您应该声明与 Leaf 类中使用的相同的类型边界
关于java - 有人可以解释这个 "cannot be converted"Java 泛型错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366733/
我是一名优秀的程序员,十分优秀!