(这有点是我的previous question)
的后续内容我有Foo<?>
个对象,foo
。 Foo<T>
是一个界面。
如何将类型值隐藏在<?>
?
请注意,这不是一件容易的事,因为foo
可以是类Bar<String>
的对象,其中Bar<T> implements Foo<T>
或某些实现接口FloatFoo
的anonyomus类,其中FloatFoo extends Foo<Float>
。我需要一个适用于所有情况的解决方案。
提前致谢:)
答案 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();
也许这不是最优雅的解决方案,但绝对是最简单的解决方案。