Вы не можете ссылаться на статические элементы параметра типа (например, вы пытаетесь сделать это в форме T.class
). Вы также не можете использовать их в выражениях instanceof
. В более общем плане, поскольку Java-генерики реализуются с помощью стирания типа, вы не можете использовать параметры типа каким-либо образом во время выполнения - весь тип анализа выполняется статически во время компиляции.
В зависимости от того, что вы после этого, существует как минимум два альтернативных подхода.
Первый и более обычный, чтобы гарантировать, что необходимые типы могут быть проверены статически. Например, вы можете параметризовать свой класс Wrapper
с типом объекта, который он обертывает. Затем, предположив, что вы используете его в программе, безопасной по типу, где бы вы ни находились Wrapper<String>
, вы знаете, что обернутый объект является String
.
Это не работает так хорошо, если вы хотите проверить конкретный класс обернутого объекта, однако, если класс для тестирования не равен final
. В этом случае, вы можете передать на Class
объект, что-то вроде этого:
<T> boolean compare(Wrapper<? super T> wrapper, Class<T> clazz) {
return wrapper.obj.getClass().equals(clazz);
}
Это проверяет класс обернутого объекта против указанного класса, что позволяет метод, который будет вызываться только в тех случаях, когда статический анализ позволяет что он может вернуться true
.
Вы можете фактически объединить эти два подхода, если вы хотите, чтобы создать Wrapper
класс, экземпляры которого могут содержать только члены определенного класса, в отличие от любого объекта, присваиваемые данного типа . Я не уверен, почему вы хотели бы это сделать.
Я вижу, это решение должно быть подходящим для того, что мне нужно, спасибо. Как этот метод обрабатывает наследование btw? т.е. если у меня есть B: A, будет сравнивать (B, A.class) возврат true? – Madden