我的课程定义如下:
static class ParallelMergeSort<T extends Comparable<Pair>> extends RecursiveAction
Pair
是上面使用方法getSecond()
定义的类。
在合并排序类中,我有一个定义为:
的方法 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;
^
我应该改变什么来缓解这个问题?
答案 0 :(得分:4)
进行检查时:
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
是设计糟糕的标志。