gpt4 book ai didi

java - 在通用上下文中使用 getActualTypeArguments

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:04 24 4
gpt4 key购买 nike

还有其他相关问题,例如6624113 , 3403909 , 4516891但我的问题更简单也更具体。

我想在运行时知道我的类被参数化的类型 - 我想要一个类型参数类型的 Class 对象。由于类型删除,表达式T.class 不起作用,并且C# 中没有类似typeof(T) 的函数来获取它。

但是,通过 ParameterizedType 可以获得一些“ super 反射”和相关类(class),这让我几乎一路走来。

import java.lang.reflect.ParameterizedType;

public class MyClass<T> {
public static void main( String[] args ) {
new MyClass<Integer>().printTypeParam();
}

public void printTypeParam() {
class DummyT extends MyClass<T> {}
class DummyString extends MyClass<String> {}

ParameterizedType ptT =
((ParameterizedType) DummyT.class.getGenericSuperclass() );

ParameterizedType ptString =
((ParameterizedType) DummyString.class.getGenericSuperclass() );

System.out.println( "DummyT: " + ptT + " " + ptT.getActualTypeArguments()[0] );
System.out.println( "DummyString: " + ptString + " " + ptString.getActualTypeArguments()[0] );

}
}

当我运行上面的代码时,我看到了这个输出:

DummyT: MyClass<T> T
DummyString: MyClass<java.lang.String> class java.lang.String

如您所见,这适用于类型参数在编译时在包含对 getGenericSuperClass 的调用的代码行中已知的情况,但在该调用本身处理泛型的情况下,它只是打印类型参数的名称。

有什么方法可以让第一行打印 java.lang.Integer 而不是 T

最佳答案

你不能,简单明了。 Integer 没有具体化,完全是erased .如果您不相信我,请使用 IntegerLong 编译文件一次。这两个二进制类文件将完全相同。

类型删除是一个严酷的现实,您将无法回避。我建议您重新思考为什么您需要它,而不是沿着引入黑客的道路试图避免它。

有用的 AngelikaLanger 泛型常见问题解答主题:

关于java - 在通用上下文中使用 getActualTypeArguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8012676/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com