Java 混凝土类的泛型
如何从具体类中获取泛型类型。例如,我有:Java 混凝土类的泛型,java,generics,Java,Generics,如何从具体类中获取泛型类型。例如,我有: class MyClass<String> { public Type getGenericType { // how can I return String.class in here? } } class-MyClass { 公共类型getGenericType { //在这里如何返回String.class? } } 我可以用抽象类这样做: abstract class MyClass<String>
class MyClass<String>
{
public Type getGenericType
{
// how can I return String.class in here?
}
}
class-MyClass
{
公共类型getGenericType
{
//在这里如何返回String.class?
}
}
我可以用抽象类这样做:
abstract class MyClass<String>
{
public Type getGenericType
{
Type t = this.getClass().getGenericSuperclass();
return ((ParameterizedType)t).getActualTypeArguments()[0];
}
}
public class MyClass<T> {
private final Class<T> type;
@SuppressWarnings("unchecked")
public MyClass() {
type = (Class<T>) this.getClass();
}
public Class<T> getGenericType() {
return type;
}
}
抽象类MyClass
{
公共类型getGenericType
{
类型t=this.getClass().getGenericSuperclass();
返回((ParameterizedType)t.getActualTypeArguments()[0];
}
}
如何像抽象类一样对具体类执行类似的操作。如果我不能,你能解释为什么吗
谢谢,您不能这样做,因为一旦代码被编译,泛型就不再存在了。
您的
字符串
实际上变成了对象
当您的代码试图在编译后运行时,这显然会导致问题…请尝试以下操作:
abstract class MyClass<String>
{
public Type getGenericType
{
Type t = this.getClass().getGenericSuperclass();
return ((ParameterizedType)t).getActualTypeArguments()[0];
}
}
public class MyClass<T> {
private final Class<T> type;
@SuppressWarnings("unchecked")
public MyClass() {
type = (Class<T>) this.getClass();
}
public Class<T> getGenericType() {
return type;
}
}
公共类MyClass{
私有最终类类型;
@抑制警告(“未选中”)
公共MyClass(){
type=(Class)this.getClass();
}
公共类getGenericType(){
返回类型;
}
}
在此阶段,Java不支持泛型。但是,可以在运行时获取字段和方法的参数类型信息。对这件事有很好的了解。对于类,通常可以方便地将参数类型显式地传递到构造函数中:
class ClassWithParameter<T> {
private final Class<T> parameterType;
public ClassWithParameter(final Class<T> parameterType) {
this.parameterType = parameterType;
}
... }
ClassWithParameter类{
私有final类参数type;
公共类WithParameter(最终类参数类型){
this.parameterType=parameterType;
}
... }
或者,可以创建一个带有Class属性的自定义运行时注释,并用于注释类,这些类在运行时需要参数类型信息。您的示例没有真正意义。
String
是否为此处的类型参数?为什么选择“字符串”而不是不太可能引起混淆的东西?按照惯例,类型参数是单个字母,例如E
或T
。您是对的。通常我会使String=T,但为了说明我的观点,我把它放在这里,构造函数和成员什么都不做。如果这样做有效,那么公共类getGenericType(){返回this.getClass();}