如何获取Foo <?>对象的<?>值?

mik*_*1aj 6 java generics reflection

(这有点是我上一个问题的后续内容)

我有一个Foo<?>对象,foo.Foo<T>是一个界面.

如何获取隐藏在后面的类型值<?>

请注意,这不是微不足道的,例如foo可以是类的对象Bar<String>,其中Bar<T> implements Foo<T>,或者某些anonyomus类实现接口FloatFoo,其中FloatFoo extends Foo<Float>.我需要一个适用于所有情况的解决方案.

提前致谢 :)

lin*_*r27 9

使用反射是不可能的,因为Java Generics存在Type Erasure的问题.在运行时,Foo已经删除了为泛型类定义的类型,因此使用该类的反射将不会产生其泛型类型.此类型信息仅用于编译类型安全性.

C#没有这个问题,可以访问类的模板化类型.

是差异的概述.


Rid*_*del 8

好吧,简而言之,你做不到.

但是,你可以做的就是获得<?>使用时的价值FloatFoo.

实际上,根据我的记忆,泛型不会保留在课堂信息中.

但是,当您创建泛型类型的子类型(无论是类还是接口)时,必须记住泛型信息,因为它可能会定义某些子类型的方法签名.

例如,如果您的Foointerface声明为:

public interface Foo<T> {
    public T doIt();
}
Run Code Online (Sandbox Code Playgroud)

有一个

public interface FloatFoo extends Foo<Float>
Run Code Online (Sandbox Code Playgroud)

暗示这个界面有一个

public Float doIt();
Run Code Online (Sandbox Code Playgroud)

方法声明.

为此,编译器必须具有类型信息.并且这些信息将反映在反射API中,因为FloatFoo超类将具有与之关联的一些类型参数.或者至少它是我记得从我遇到过这种情况的少数情况(或者详细阐述它们,因为它有时可能是强制性的)

但是你会在Angelika的仿制药常见问题解答中获得更完整的信息.

  • 相关的,也许有帮助的:http://www.artima.com/weblogs/viewpost.jsp?thread = 208860 (3认同)

mik*_*1aj 2

最终的(也许是最好的)解决方案:我重构了我的代码,所以它不需要这个。我将所有需要类型参数的代码移至Foo,因此我可以在类中提供适当的实现。结果代码少了很多。