2

Generic Comparatorに示されているサンプルに基づいて、汎用コンパレータとして使用する Java クラスを構築しています。コンパレーター用に構築しているコンストラクターは次のとおりです。

public GenericComparator(java.lang.reflect.Field sortField, boolean ascending){
        ....   }

上記のコンストラクターを使用すると、並べ替えフィールドを取得できますが、フィールドがインターフェイスを実装しているかどうかをコンパイラーが知る方法はなくComparable、コンストラクターを呼び出す開発者は、インターフェイスを実装していないフィールドを渡す可能性がありComparableます。

フィールドがインターフェイスを実装していることを確認するために instanceof チェックを使用して、これをコンパイル時エラーにし、実行時に処理しない方法があるかどうか疑問に思っています。

Collections.sort(...)Type 宣言にも同様の実装があります。

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    ...
}
4

1 に答える 1

3
Comparable.isAssignableFrom(field.getType())

実行時にそれを行いますが、これをコンパイル時のエラーにする方法はまったくありません。フィールドは、コンパイル時に型情報を保持しません (実際には保持できません)。これらは実行時オブジェクトであり、実行時に選択できます。たとえば、

random.nextBoolean() ? Foo.class.getField("bar") : Foo.class.getField("baz")

その場合、コンパイラは、どんなに賢くても、結果のフィールドがどのような型になるかをコンパイル時に知ることができませんでした。

于 2013-01-24T18:02:55.457 に答える