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>实际上都是同一个类(class);它们没有单独的类对象,因此类对象参数无法告诉您的方法它应该返回什么样的列表。

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

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

相关文章:

java - 对 List<Generic> 显式强制转换的怀疑

java - 如何使用mockito/powermockito模拟IamRequest impl类?

Java : How to use the `Comparator` interface

java - 遍历节点列表,this = this.next在java中不起作用?

Java 泛型转换,非直接

swift - Comparable 协议(protocol)可以通用吗?

java - 删除android应用程序的标题栏

java - 使用 ImageIO.write 时出现 OutOfMemory

c# - 如何选择从泛型方法调用的正确的 C# 重载扩展方法

java - 为什么这个泛型方法不接受任何类型?