类型变量的Java类对象

Ale*_*rev 21 java generics type-erasure

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

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

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

sfu*_*ger 25

这有效:

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

  • @GaryF:反过来说:在泛型类型的*instances*中没有关于类型参数的信息,但在编译时实体(例如类和字段)中有*信息. (6认同)
  • 亚历山大,到底有什么用?在你的例子中有一个类型变量`T`,而在这个片段中它是'String`而不是.你已经知道它是`String`,所有这些操作的重点是什么?你有没有设法解决问题中提到的`T.class`问题? (5认同)
  • @Roman不行吗?试试吧.无论如何,在坚持你的错误答案的情况下实际上没有这样做也是荒谬的. (4认同)
  • 罗曼:我建议你真的尝试一下.是的,类型被擦除,在编译时不能依赖,但您可以使用运行时反射来查看这些类型是什么.它带有一些陷阱,但广泛的工作. (2认同)

tkr*_*tkr 6

代码片段有点令人困惑.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());
}
Run Code Online (Sandbox Code Playgroud)

实际上第二个println会导致异常.

  • 它是一个TypeVariable(因此不能转换为Class)并且包含T(如字符串而不是类),它没有任何用处. (2认同)