gpt4 book ai didi

java - 获取方法的泛型类型

转载 作者:太空宇宙 更新时间:2023-11-04 14:21:46 25 4
gpt4 key购买 nike

也许这个问题以前已经回答过,但我在这里没有找到。考虑以下代码行:

public static <T> T getAs() { ... }

可以获得对象Class<T> ,通过反射?

为了澄清,我没有查看类的通用类型,例如

class Foo<T> {
public T get() { ...}
}

例如,这可以在 C# 中完成,非常方便

class Foo {
private List<A> items;

public <T extends A> T first() {
Class<T> clazz = //Magic??
foreach (A a : items) {
if (clazz.isInstance(a)) return (T)a;
}
return null;
}

}

像这样使用:

SubClass s = fooInst.<SubClass>first();

最佳答案

有时,即使在编译之后也确实可以获取泛型类型信息。理论上,这对于泛型方法调用来说甚至是可能的。剧透,这是一个坏主意。然而,出于学术原因,让我们考虑一下这如何可能:

  1. 从方法内部检查执行堆栈。
  2. 提取调用类。
  3. 找到并解释调用类的类文件,并解析其调用方法的字节码。
  4. 找到调用该方法的行。
  5. 模拟javac的类型推断机制并为 T 找到相同的类型javac 会推断出来。
  6. 按您为 T 找到的名称加载该类.

这当然不会很好地工作,如果 T 的类型会被破坏。在源代码中明确指定。您不会想这样做,因为您的方法调用会突然需要 IO。

您可能想要的是返回:

<T> T getAs(Class<? extends T> type) { ... }

在这种情况下,您要求用户向您提供所需的类型,但您以类型安全的方式进行操作。

关于java - 获取方法的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27104944/

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