我正在使用Hibernate验证器,并尝试创建一个小的工具类:
public class DataRecordValidator<T> {
public void validate(Class<T> clazz, T validateMe) {
ClassValidator<T> validator = new ClassValidator<T>(clazz);
InvalidValue[] errors = validator.getInvalidValues(validateMe);
[...]
}
}
问题是,在执行
new ClassValidator<T>(clazz)
时,为什么需要提供Class<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方法在此处(点击这里)。
validateMe.getClass()
呢? - Marcus LeongetClass()
... 我刚刚检查了,编译器可以接受这个。 - Ondra ŽižkavalidateMe.getClass()
,但有一些注意事项:如果validateMe
是null
,则会引发NullPointerException
,这可能是您想要的,也可能不是。并且使用当前代码,您可以传递一个基本类(例如,使用其基类Person
的规则验证此Employee
实例)。如果省略Class
参数,则不再可能。 - Joachim Sauer