Вопрос о дженериках Java - Класс <T> по сравнению с T?

Я использую, в спящем режиме блок проверки допустимости и пытающийся создать немного util класса:

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

Вопрос, почему я должен предоставить Class clazz параметр при выполнении new ClassValidator(clazz)? Почему не может Вы указывать:

  1. T как в ClassValidator(T)?
  2. validateMe.getClass() как в ClassValidator(validateMe.getClass())

Я получаю ошибки, когда я пытаюсь сделать обе опции.

Править: Я понимаю, почему № 1 не работает. Но я не добираюсь, почему № 2 не работает. Я в настоящее время получаю эту ошибку с № 2:

cannot find symbol
symbol  : constructor ClassValidator(java.lang.Class)
location: class org.hibernate.validator.ClassValidator

Примечание: Будьте в спящем режиме метод API (здесь)

7
задан Marcus Leon 24 January 2010 в 15:39
поделиться

3 ответа

Мой 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 во время выполнения, но это легко поддается отладке, хотя это не совсем идея за дженериками.

1
ответ дан 7 December 2019 в 03:15
поделиться

Поскольку T не является значением - это просто намек для компилятора. JVM не имеет подсказки т . Вы можете использовать Generics только как тип для целей проверки типа в компиляции.

8
ответ дан 7 December 2019 в 03:15
поделиться

Поскольку ClassValidator требует в качестве параметра объекта Class, НЕ экземпляр данного класса. Имейте в виду, что вы можете сделать то, что пытаетесь сделать с этим кодом:

ClassValidator<? extends T> validator = new ClassValidator<? extends T>(validateMe.getClass());
0
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: