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

时间:2010-09-01 07:48:42

标签: java generics reflection

(这有点是我的previous question

的后续内容

我有Foo<?>个对象,fooFoo<T>是一个界面。

如何将类型值隐藏在<?>

后面

请注意,这不是一件容易的事,因为foo可以是类Bar<String>的对象,其中Bar<T> implements Foo<T>或某些实现接口FloatFoo的anonyomus类,其中FloatFoo extends Foo<Float>。我需要一个适用于所有情况的解决方案。

提前致谢:)

4 个答案:

答案 0 :(得分:9)

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

C#没有此问题,可以访问类的模板化类型。

This概述了差异。

答案 1 :(得分:8)

嗯,简而言之,你不能。

但是,使用<?>时,您可以获得FloatFoo的值。

事实上,根据我的记忆,仿制药并没有留在课堂信息中。

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

例如,如果您的Foo接口声明为:

public interface Foo<T> {
    public T doIt();
}

有一个

public interface FloatFoo extends Foo<Float>

暗示此界面有

public Float doIt();

声明的方法。

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

但是你会在Angelika's generics FAQ获得更完整的信息。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我最终在界面中创建了一个getType()方法:

Class<T> getType();

也许这不是最优雅的解决方案,但绝对是最简单的解决方案。