[英]class java.lang.Class cannot be cast to class java.lang.reflect.Parameterized
Java 11 Java 11
I need to get generic type on runtime.我需要在运行时获取泛型类型。
Here client code:这里客户端代码:
var dataTemplateClient = new DataTemplateJdbc<Client>(dbExecutor, entitySQLMetaDataClient);
public class Client {
@Id
private Long id;
private String name;
}
Here code:这里代码:
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];
}
But I get error in this line:但我在这一行得到错误:
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
Error:错误:
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)
Basically, what you are trying to do won't work.基本上,您尝试做的事情是行不通的。 You cannot get the actual type
T
at runtime.您无法在运行时获得实际的
T
类型。
When you call getClass()
on a DataTemplateJdbc
, it will give you the Class
object that represents the erased type.当您在
DataTemplateJdbc
上调用getClass()
时,它将为您提供代表已擦除类型的Class
object。 That is all that is available.这就是所有可用的。
The reason that the typecast fails is that a Class
can never represent a parameterized type.类型转换失败的原因是
Class
永远不能表示参数化类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.