实际上,在Java中使用一些“技巧”是可能的。不要屈服于C#狂热分子的压力!(j / k)
“技巧”是创建一个扩展通用类型的类,并
Type通过
.getGenericSuperclass()或返回的值访问父类的类型参数的值
.getGenericInterfaces()。
这很麻烦。为了简化我们的生活,Google已经为我们编写了大部分无聊的代码,并通过Guava提供了该代码。
检查 TypeToken
课程,它确实满足您的要求。例如:
TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
然后,您绕过a
TypeToken<T>而不是a就
Class<T>这样。它为您提供了对T表示的类型进行反射的方法。
它在内部所做的只是调用
.getClass().getGenericSuperclass()(或
...Interfaces()),然后从
Type进行一些丑陋的转换,
ParameterizedType并从那里检索所有信息(
.getActualTypeArguments(),等等)。
最后,如果您想对Dependency Injection做一些类似的事情(即,假设您需要
Class<T>在类的构造函数中注入a
,或者想获取某个参数化接口的实例,则该实例中的实例应取决于类型参数) ),Google
Guice(来自Google的DI容器)具有一种非常相似的机制来解决该问题,称为
TypeLiteral。幕后的用法和代码与
TypeTokenGuava
几乎相同。在这里检查:
TypeLiteral
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)