Я использую, в спящем режиме блок проверки допустимости и пытающийся создать немного util класса:
public class DataRecordValidator {
public void validate(Class clazz, T validateMe) {
ClassValidator validator = new ClassValidator(clazz);
InvalidValue[] errors = validator.getInvalidValues(validateMe);
[...]
}
}
Вопрос, почему я должен предоставить Class
параметр при выполнении new ClassValidator
? Почему не может Вы указывать:
T
как в ClassValidator(T)
? validateMe.getClass()
как в ClassValidator(validateMe.getClass())
Я получаю ошибки, когда я пытаюсь сделать обе опции.
Править: Я понимаю, почему № 1 не работает. Но я не добираюсь, почему № 2 не работает. Я в настоящее время получаю эту ошибку с № 2:
cannot find symbol
symbol : constructor ClassValidator(java.lang.Class)
location: class org.hibernate.validator.ClassValidator
Примечание: Будьте в спящем режиме метод API (здесь)
Мой iPhone может делать фотографии с борта автомобиля, которые довольно размыты бесплатно... через 10-20 футов. Внутри этого вещи просто движутся слишком быстро; выдержка должна быть выше, чтобы не размывать ее.
Начать с веб-камеры среднего класса и двигаться вверх по мере необходимости? Ноутбук и поездка в машине во время съемки неподвижных изображений, вероятно, дадут вам представление о том, как хорошо это работает.
-121--4950840- Если метод validate
является вашим, то можно безопасно пропустить атрибут Class
atribute.
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
во время выполнения, но это легко поддается отладке, хотя это не совсем идея за дженериками.
Поскольку T
не является значением - это просто намек для компилятора. JVM не имеет подсказки т
. Вы можете использовать Generics только как тип для целей проверки типа в компиляции.
Поскольку ClassValidator требует в качестве параметра объекта Class, НЕ экземпляр данного класса. Имейте в виду, что вы можете сделать то, что пытаетесь сделать с этим кодом:
ClassValidator<? extends T> validator = new ClassValidator<? extends T>(validateMe.getClass());