泛型无法找到符号

时间:2017-03-14 09:13:24

标签: java generics bounded-types

我的课程定义如下:

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;
                                ^

我应该改变什么来缓解这个问题?

1 个答案:

答案 0 :(得分:4)

进行检查时:

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是设计糟糕的标志。