7

私は Hibernate バリデーターを使用しており、小さな util クラスを作成しようとしています:

public class DataRecordValidator<T> {
    public void validate(Class<T> clazz, T validateMe) {
        ClassValidator<T> validator = new ClassValidator<T>(clazz);
        InvalidValue[] errors = validator.getInvalidValues(validateMe);
        [...]
    }
}

Class<T> clazz質問は、実行時にパラメーターを指定する必要があるのはなぜnew ClassValidator<T>(clazz)ですか? 指定できない理由:

  1. TのようにClassValidator<T>(T)
  2. validateMe.getClass()のようにClassValidator<T>(validateMe.getClass())

両方のオプションを実行しようとするとエラーが発生します。

編集:#1が機能しない理由を理解しています。しかし、#2が機能しない理由がわかりません。現在、#2でこのエラーが発生しています:

cannot find symbol
symbol  : constructor ClassValidator(java.lang.Class<capture#279 of ? extends java.lang.Object>)
location: class org.hibernate.validator.ClassValidator<T>

注: Hibernate API メソッドは (ここ)

4

3 に答える 3

8

は値ではないためT、コンパイラのヒントにすぎません。JVM にはT. ジェネリックは、コンパイル時の型チェックの目的でのみ型として使用できます。

于 2010-01-15T21:12:31.293 に答える
1

validateメソッドがあなたのものである場合は、属性を安全にスキップできますClass

public void validate(T validateMe) {
    ClassValidator<T> validator = 
           new ClassValidator<T>((Class<T>) validateMe.getClass());
    ...
}

ただし、ClassValidatorコンストラクターにはClass引数が必要です。

安全でないキャストを使用することは推奨されませんが、この場合、次のようなものがなければ実際には安全です。

class A {..}
class B extends A {..}

new DataRecordValidator<A>.validate(new B());

そのようなことをする必要があると思われる場合はClass、メソッドに引数を含めてください。そうしないとClassCastException、実行時に取得される可能性がありますが、これは簡単にデバッグできますが、ジェネリックの背後にある考え方ではありません。

于 2010-01-15T21:14:07.063 に答える
0

ClassValidatorは、問題のクラスのインスタンスではなく、そのパラメーターとして Class オブジェクトを必要とするためです。このコードでやろうとしていることを実行できる可能性があることに注意してください。

ClassValidator<? extends T> validator = new ClassValidator<? extends T>(validateMe.getClass());
于 2010-01-15T21:11:36.017 に答える