我在当前无法编译的循环中有一个方法调用:

for (Example example : Util.getExample(List.class)) {
    // Do something with example
}


实用程序:

public class Util {
    public <T> T getExample(Class<T> clazz) {
        //...
    }
}


明显的解决方法是将返回值从getExample强制转换为List<Example>。我想知道:是否有另一种避免演员阵容的方法?

更多信息:

海报要求更多信息,所以这里...

我围绕注释处理构建了一个框架,该框架编写代码以访问和变异类成员(构造函数,字段和方法)。该框架支持ParcelerTransfuse,并允许我在编译期间识别属性并生成代码以访问或修改所述属性。对于私有属性(私有构造函数,私有字段,私有方法),我使用实用程序执行这些操作(Parceler'sTransfuse'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/

10-10 07:28