泛型找不到符号
Generics cannot find symbol
我有一个class定义如下:
static class ParallelMergeSort<T extends Comparable<Pair>> extends RecursiveAction
其中 Pair
是上面用方法 getSecond()
定义的 class。
在归并排序class中,我有一个方法定义为:
private boolean isLess(T a, T b) {
if (a instanceof Pair<?,?>) return a.getSecond().compareTo(b.getSecond()) < 0;
return a.compareTo(b) < 0;
}
即使我正在检查 T
将是 Pair
的实例,编译器仍然会出现错误 cannot find symbol
:
return a.getSecond().compareTo(b.getSecond()) < 0;
^
我应该做些什么来缓解这个问题?
检查时:
if (a instanceof Pair)
那么你应该将 a
和 b
转换为 Pair
然后进行比较:
if (a instanceof Pair && b instanceof Pair) {
Pair<?, ?> cast_a = (Pair) a;
Pair<?, ?> cast_b = (Pair) b;
return cast_a.getSecond().compareTo(cast_b.getSecond()) < 0;
}
目前,编译器无法编译,因为 T
可能是 Comparable<Pair>
的另一个子类型,而且编译器没有任何证据表明 T
会正好 Pair
那么它不允许编译。
关于您的代码的几点说明:
instanceof
运算符的右操作数应该是原始的。通用(如 Pair<?, ?>
)没有任何意义,因为此检查将在运行时完成,届时通用信息将被删除。
- 我不确定你设计的好不好,所以你至少应该重新考虑一下。必须使用
instanceof
是糟糕设计的标志。
我有一个class定义如下:
static class ParallelMergeSort<T extends Comparable<Pair>> extends RecursiveAction
其中 Pair
是上面用方法 getSecond()
定义的 class。
在归并排序class中,我有一个方法定义为:
private boolean isLess(T a, T b) {
if (a instanceof Pair<?,?>) return a.getSecond().compareTo(b.getSecond()) < 0;
return a.compareTo(b) < 0;
}
即使我正在检查 T
将是 Pair
的实例,编译器仍然会出现错误 cannot find symbol
:
return a.getSecond().compareTo(b.getSecond()) < 0;
^
我应该做些什么来缓解这个问题?
检查时:
if (a instanceof Pair)
那么你应该将 a
和 b
转换为 Pair
然后进行比较:
if (a instanceof Pair && b instanceof Pair) {
Pair<?, ?> cast_a = (Pair) a;
Pair<?, ?> cast_b = (Pair) b;
return cast_a.getSecond().compareTo(cast_b.getSecond()) < 0;
}
目前,编译器无法编译,因为 T
可能是 Comparable<Pair>
的另一个子类型,而且编译器没有任何证据表明 T
会正好 Pair
那么它不允许编译。
关于您的代码的几点说明:
instanceof
运算符的右操作数应该是原始的。通用(如Pair<?, ?>
)没有任何意义,因为此检查将在运行时完成,届时通用信息将被删除。- 我不确定你设计的好不好,所以你至少应该重新考虑一下。必须使用
instanceof
是糟糕设计的标志。