【问题标题】:Java class object from type variable来自类型变量的 Java 类对象
【发布时间】:2010-05-10 08:24:50
【问题描述】:

有没有办法从 Java 泛型类中的类型变量中获取 Class 对象?类似的东西:

public class Bar extends Foo<T> {
    public Class getParameterClass() {
        return T.class; // doesn't compile
    }
}

此类型信息在编译时可用,因此不应受到类型擦除的影响,因此,理论上,应该有一种方法可以实现这一点。存在吗?

【问题讨论】:

  • 你的声明真的应该是 public class Bar extends Foo {... ??

标签: java generics type-erasure


【解决方案1】:

这行得通:

public static class Bar extends Foo<String> {
  public Class<?> getParameterClass() {
    return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
  }
}

【讨论】:

  • @Roman 不能吗?简单地尝试一下。无论如何,在坚持你的错误答案的同时没有实际这样做的情况下投票是荒谬的。
  • Roman:我建议你真的试试这个。是的,类型在编译时被删除并且不能被依赖,但是您可以使用运行时反射来查看这些类型是什么。它有一些陷阱,但可以广泛使用。
  • @GaryF:实际上更多的是反过来:在泛型类型的instances中没有关于类型参数的信息,但有信息在类和字段等编译时实体中。
  • Alexander,到底什么是有效的?在您的示例中,有一个类型变量 T,而在这个 sn-p 中,它是 String。你已经知道它是String,所有这些操作的意义何在?题中提到的T.class问题你解决了吗?
【解决方案2】:

代码 sn-p 有点混乱。 T 是类型参数还是类?

public static class Bar extends Foo<String> {
    public Class<?> getParameterClass() {
        return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
    }
}

public static class Bar2<T> extends Foo<T> {
    public Class<?> getParameterClass() {
        return (Class<?>) (((ParameterizedType)Bar2.class.getGenericSuperclass()).getActualTypeArguments()[0]);
    }
}


public static void main(String[] args) {
    System.out.println(new Bar().getParameterClass());
    System.out.println(new Bar2<Object>().getParameterClass());
}

其实第二个println会引发异常。

【讨论】:

  • 有没有办法修复第二个?
  • 它是一个 TypeVariable(因此不能转换为 Class)并包含 T(如在 string 而非 class 中),这说明没有任何用处。
  • 原帖中的例子没有声明 T 为参数。像这样写的T一定是类……
【解决方案3】:

此代码也适用于派生类:

import java.lang.reflect.ParameterizedType;

public abstract class A<B> 
{
    public Class<B> getClassOfB() throws Exception 
    {
        ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();

        return (Class<B>) superclass.getActualTypeArguments()[0];
    }
}

从这里截取:https://stackoverflow.com/a/4699117/26510

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2013-11-07
    • 2016-11-05
    • 2021-08-26
    • 1970-01-01
    • 2015-01-01
    相关资源
    最近更新 更多