java - 循环中的泛型,试图避免强制转换

原文 标签 java generics

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

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并允许我在编译期间识别属性并生成代码以访问或修改所述属性。对于私有(private)属性(私有(private)构造函数、私有(private)字段、私有(private)方法),我使用一个实用程序来执行这些操作(Parceler'sTransfuse's)以通过反射打破封装。

Parceler 具有在序列化期间展开集合的功能,以便序列化给定集合的成员。对于私有(private) Collection ,InjectionUtil用于在循环中访问这些属性:
for (Example example : InjectionUtil.getField(List.class, Container.class, container, "exampleField")) {
    // ...
}

哪个是 bug我目前面临着,因此,为什么我要问避免类型转换。我宁愿不强制转换,因为我想一般地生成一些代码来访问类型并在此过程中尊重 Java 泛型。

最佳答案

如果您的 getExample方法应该总是返回一个列表,然后是的,将其返回类型更改为 List<T> .但既然你要通过 List.class作为一个参数,您似乎想要一个可以返回列表和非列表的方法,具体取决于您传递的类对象。

如果是这样,那将不会像您希望的那样工作。在这种情况下,您的方法仅返回 List ,原始类型。让它返回 List<Example> ,您必须将其传递给假设的 List<Example>.class ,但没有这样的事情。泛型类型参数在编译时被删除,所以 List<Example>List<String>确实是同一类;它们没有单独的类对象,所以类对象参数不能告诉你的方法它应该返回什么样的列表。

您可能需要尝试不同的设计方法。由于这显然是一个简化的示例,因此如果您发布有关您实际尝试完成的内容的更多详细信息,您可能会获得更多帮助。

关于java - 循环中的泛型,试图避免强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44038465/

相关文章:

java - 将列表中的元素映射到另一个列表中的位置

java - 如何跨不同设备缩放自定义 View

c# - 如何比较 POCO 之间的字段/属性?

Scala 解决 Comparator.thenComparing 中的错误覆盖

java - 在Java中创建泛型类型的实例?

swift - 特定于枚举成员的通用约束

java - 是否可以将字符串传递给接口(interface)?或者至少从接口(interface)内的 SharedPreferences 获取?

java - 在运行时具有多个数据源的 Spring 批处理

java - 更新分位数而不是重新计算

c# - 实现通用接口(interface)的问题