1

ジェネリックを使用し、コンパイラの警告を回避して、以下のコードを記述する方法を知っている人はいますか? (@SuppressWarnings("unchecked") は不正行為と見なされます)。

そして、おそらく、「左」のタイプが「右」のタイプと同じであることをジェネリックを介して確認しますか?

public void assertLessOrEqual(Comparable left, Comparable right) {
    if (left == null || right == null || (left.compareTo(right) > 0)) {
        String msg = "["+left+"] is not less than ["+right+"]";
        throw new RuntimeException("assertLessOrEqual: " + msg);
    }
}
4

3 に答える 3

12

これは、 Comparable 型のサブクラスでも機能します。

public <T extends Comparable<? super T>> void assertLessOrEqual(T left, T right) {
  if (left == null || right == null || left.compareTo(right) > 0) {
    String msg = "["+left+"] is not less than ["+right+"]";
    throw new RuntimeException("assertLessOrEqual: " + msg);
  }
}
于 2009-09-17T11:00:55.193 に答える
3

これはどう:

public <T extends Comparable<T>> void assertLessOrEqual(T left, T right) {
  if (left == null || right == null || (left.compareTo(right) > 0)) {
    String msg = "["+left+"] is not less than ["+right+"]";
    throw new RuntimeException("assertLessOrEqual: " + msg);
  }
}

おそらくもう少し一般的にすることができますが、それをより複雑にすることによってのみ:)

于 2009-09-17T10:48:00.210 に答える
2

実行時に「左」のタイプが「右」のタイプと同じかどうかをジェネリック経由でチェックすることはできません。Java ジェネリックは型消去を介して実装されるため、ジェネリック型パラメーターに関する情報は実行時に失われます。

public <T extends Comparable<T>> void assertLessOrEqual(T left, T right) {
    if (left == null || right == null || (left.compareTo(right) > 0)) {
        String msg = "["+left+"] is not less than ["+right+"]";
        throw new RuntimeException("assertLessOrEqual: " + msg);
    }
}
于 2009-09-17T10:46:24.580 に答える