![](/img/trans.png)
[英]How to get Flowable<List<Foo>> from 'Bar' Object with One-to-many relations 'Foo' using realm and Rxjava
[英]How to get the <?> value for a Foo<?> object?
(这有点是我上一个问题的后续内容)
我有一个Foo<?>
对象, foo
。 Foo<T>
是一个界面。
如何获取隐藏在<?>
后面的类型值?
请注意,这不是一件容易的事,因为foo
可以是类Bar<String>
的对象,其中Bar<T> implements Foo<T>
,或实现接口FloatFoo
一些anonyomus类,其中FloatFoo extends Foo<Float>
。 我需要一个适用于所有情况的解决方案。
提前致谢 :)
使用反射是不可能的,因为Java Generics存在Type Erasure的问题。 在运行时,已经删除了为泛型类Foo
定义的类型,因此在该类上使用反射将不会产生其泛型类型。 此类型信息仅用于编译类型安全性。
C#没有这个问题,可以访问类的模板化类型。
这是差异的概述。
好吧,简而言之,你做不到。
但是,您可以做的是在使用FloatFoo
时获取<?>
的值。
实际上,根据我的记忆,泛型不会保留在课堂信息中。
但是,当您创建泛型类型的子类型(无论是类还是接口)时,必须记住泛型信息,因为它可以定义某些子类型的方法签名。
例如,如果您的Foo
接口声明为:
public interface Foo<T> {
public T doIt();
}
有一个
public interface FloatFoo extends Foo<Float>
暗示这个界面有一个
public Float doIt();
方法声明。
为此,编译器必须具有类型信息。 并且这些信息将反映在反射API中,因为FloatFoo
的超类将具有与之关联的一些Type参数。 或者至少它是我记得从我遇到过这种情况的少数情况(或者详细阐述它们,因为它有时可能是强制性的)
但是你会在Angelika的仿制药常见问题解答中获得更完整的信息。
最终决赛(也许是最好的)解决方案:我重构了我的代码,所以它不需要这个。 我将所有需要type参数的代码移动到Foo
,因此我可以在类中提供适当的实现。 结果证明代码要少得多。
我最终在界面中创建了一个getType()
方法:
Class<T> getType();
也许它不是最优雅的解决方案,但绝对是最简单的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.