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