mik*_*1aj 6 java generics reflection
(这有点是我上一个问题的后续内容)
我有一个Foo<?>
对象,foo
.Foo<T>
是一个界面.
如何获取隐藏在后面的类型值<?>
?
请注意,这不是微不足道的,例如foo
可以是类的对象Bar<String>
,其中Bar<T> implements Foo<T>
,或者某些anonyomus类实现接口FloatFoo
,其中FloatFoo extends Foo<Float>
.我需要一个适用于所有情况的解决方案.
提前致谢 :)
使用反射是不可能的,因为Java Generics存在Type Erasure的问题.在运行时,Foo
已经删除了为泛型类定义的类型,因此使用该类的反射将不会产生其泛型类型.此类型信息仅用于编译类型安全性.
C#没有这个问题,可以访问类的模板化类型.
这是差异的概述.
好吧,简而言之,你做不到.
但是,你可以做的就是获得<?>
使用时的价值FloatFoo
.
实际上,根据我的记忆,泛型不会保留在课堂信息中.
但是,当您创建泛型类型的子类型(无论是类还是接口)时,必须记住泛型信息,因为它可能会定义某些子类型的方法签名.
例如,如果您的Foo
interface声明为:
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的仿制药常见问题解答中获得更完整的信息.
归档时间: |
|
查看次数: |
214 次 |
最近记录: |