我在当前无法编译的循环中有一个方法调用:
for (Example example : Util.getExample(List.class)) {
// Do something with example
}
实用程序:
public class Util {
public <T> T getExample(Class<T> clazz) {
//...
}
}
明显的解决方法是将返回值从
getExample
强制转换为List<Example>
。我想知道:是否有另一种避免演员阵容的方法?更多信息:
海报要求更多信息,所以这里...
我围绕注释处理构建了一个框架,该框架编写代码以访问和变异类成员(构造函数,字段和方法)。该框架支持Parceler和Transfuse,并允许我在编译期间识别属性并生成代码以访问或修改所述属性。对于私有属性(私有构造函数,私有字段,私有方法),我使用实用程序执行这些操作(Parceler's,Transfuse's)以通过反射破坏封装。
Parceler具有在序列化过程中展开集合的功能,以便序列化给定集合的成员。对于私有集合,
InjectionUtil
用于在循环内访问以下属性:for (Example example : InjectionUtil.getField(List.class, Container.class, container, "exampleField")) {
// ...
}
这是我目前面临的bug,因此,为什么要问我要避免强制转换。我宁愿不要进行强制转换,因为我想一般地生成一些代码来访问类型并在此过程中尊重Java泛型。
最佳答案
在这种情况下可以使用番石榴的TypeToken
,因为List<Foo>.class
无效。通过创建匿名类来使用TypeToken。由于匿名类保留其通用签名,因此可以使用。
for (Example foo : Util.getExample(new TypeToken<List<Example>>() {}) {
// do stuff
}
// utils
public <T> T getExample(TypeToken<T> typeToken) {
Type type = typeToken.getType();
// get example
}
TypeToken比仅使用Class更具体。您也可以使用普通的
Type
作为参数,因此仍可以将其提供给Class。这就是Gson的做法。关于java - 泛型在循环中,试图避免强制转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44038465/