泛型找不到符号

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)

那么你应该将 ab 转换为 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 是糟糕设计的标志。