Java 无类型泛型类,删除其函数泛型类型

标签 java generics foreach iterable raw-types

关于 javas 泛型、可迭代和 for-each 循环的好问题。问题是,如果我声明我的“测试”类为非类型化,我就会丢失所有函数的所有通用信息,而 for-each 根本不喜欢这样。

示例

public class Test<T> implements Iterable<Integer>{

    public Test() {}

    public Iterator<Integer> iterator() {return null;}

    public static void main(String[] args) {
        Test t = new Test();

        //Good,
        //its returning an Iterator<object> but it automatically changes to  Iterator<Integer>
        Iterator<Integer> it = t.iterator();

        //Bad
        //incompatable types, required Integer, found Object
        for(Integer i : t){
        }
    }Untyped generic classes losing 
}

当“Test t”为无类型时,“iterator()”函数返回“iterator”而不是“iterator < Integer >”。

我不太确定其背后的原因,我知道解决方法就是在“Test <?”上使用通配符。 > t = 新测试()'。然而,这并不是一个理想的解决方案。
他们有什么办法只编辑类声明及其函数并使 for every 循环工作无类型吗?

最佳答案

您应该执行以下操作:

public class Test implements Iterable<Integer>{

一起删除泛型类型。

您的Test类根本不通用。它只是实现一个通用接口(interface)。声明泛型类型不是必需的。这还有一个好处是可以删除您收到的一般警告。

@Eugene提出了一个很好的观点。如果您确实想要通用 Test 类型,则应该将 Test 声明为通用迭代器:

您应该执行以下操作:

public class Test implements Iterable<Integer>{

一起删除泛型类型。

您的Test类根本不通用。它只是实现一个通用接口(interface)。声明泛型类型不是必需的。这还有一个好处是可以删除您收到的一般警告。

public class Test<T> implements Iterable<T>{

然后,请确保在实例化 Test 时使其通用。

Test<Integer> t = new Test<Integer>;

然后调用 for(Integer i: t) 将编译。

关于Java 无类型泛型类,删除其函数泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4444087/

相关文章:

c# - 如何将匿名类型强制转换为指定的强制转换以获取其所有属性

Java - Eclipse 编译器合规性级别 1.6 未按预期工作

php - 父子关系树所需的递归函数?

foreach - 如何在 SwiftUI 中 CoreData 生成的 NSSet 上使用 ForEach

java - 使用自定义 xml 协议(protocol)实现客户端,无需定义或模式

java - Flink session 窗口的延迟输出缺失

java - ListCellRenderer 未显示所需的文本

java - DES 程序运行太多轮。

c# - 使用泛型返回各种类型的List

linq - linq/lambda 中的多行 foreach 循环