我正在使用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)参数?您为什么不能指定:
  • T中的ClassValidator<T>(T)吗?
  • 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方法是(here)

    最佳答案

    如果您使用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,但这很容易调试,尽管并不是泛型背后的想法。

    10-07 16:53