繁体   English   中英

如何获得 <?> Foo的价值 <?> 宾语?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM