【发布时间】:2021-12-28 20:19:36
【问题描述】:
Java 11
我需要在运行时获取泛型类型。
这里是客户端代码:
var dataTemplateClient = new DataTemplateJdbc<Client>(dbExecutor, entitySQLMetaDataClient);
public class Client {
@Id
private Long id;
private String name;
}
这里的代码:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
public class DataTemplateJdbc<T> implements DataTemplate<T> {
private final DbExecutor dbExecutor;
private final EntitySQLMetaData entitySQLMetaData;
public DataTemplateJdbc(DbExecutor dbExecutor, EntitySQLMetaData entitySQLMetaData) {
this.dbExecutor = dbExecutor;
this.entitySQLMetaData = entitySQLMetaData;
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
Type type = genericSuperclass.getActualTypeArguments()[0];
}
但我在这一行得到错误:
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
错误:
Exception in thread "main" java.lang.ClassCastException: class java.lang.Class cannot be cast to class java.lang.reflect.ParameterizedType (java.lang.Class and java.lang.reflect.ParameterizedType are in module java.base of loader 'bootstrap')
at mypackage.DataTemplateJdbc.<init>(DataTemplateJdbc.java:26)
【问题讨论】:
-
那行不通。
DataTemplateJdbc<T>没有通用超类,它扩展了Object。您需要FooClass extends DataTemplateJdbc<Something>才能从中获取泛型类型(来自FooClass)。 -
你想要的都是不可能的。所有
getGenericX的东西充其量只会让你T。只是字面意思:“名称为 T 的无边界类型变量”。如果这是可能的,你不认为 java 会让它更容易上手吗?