Я думаю, что есть другое элегантное решение.
То, что вы хотите сделать, - это (безопасно) "передать" тип параметра универсального типа из конкретного класса в суперкласс.
Если вы позволите себе думать о типе класса как о «метаданных» в классе, это предполагает использование метода Java для кодирования метаданных во время выполнения: annotations.
Сначала определите пользовательскую аннотацию в следующих строках:*
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface EntityAnnotation {
Class entityClass();
}
Затем вы можете добавить аннотацию к вашему подклассу.
@EntityAnnotation(entityClass = PassedGenericType.class)
public class Subclass<PassedGenericType> {...}
Затем вы можете использовать этот код для получения типа класса в вашем базовом классе:
import org.springframework.core.annotation.AnnotationUtils;
.
.
.
private Class getGenericParameterType() {
final Class aClass = this.getClass();
EntityAnnotation ne =
AnnotationUtils.findAnnotation(aClass, EntityAnnotation.class);
return ne.entityClass();
}
Некоторые ограничения этого подхода:
- Вы указываете универсальный тип (
PassedGenericType
) в ДВУХ местах, а не в том, который не является СУХИМЫМ.возможно, если вы можете изменить конкретные подклассы.