質問

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

そして、多分、ジェネリックを介して、「左」のタイプが" right"のタイプと同じです。

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);
    }
}
役に立ちましたか?

解決

これは、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);
  }
}

他のヒント

これについてはどうですか:

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);
  }
}

多分少し少し一般的にすることもできますが、より複雑にするだけで:)

ジェネリックチェックでは、実行時に 'left'のタイプが 'right'のタイプと同じかどうかを確認できません。 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);
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top