Java 无类型泛型类,删除它们的函数泛型类型

Posted

技术标签:

【中文标题】Java 无类型泛型类,删除它们的函数泛型类型【英文标题】:Java untyped generic classes, removing their functions generics types 【发布时间】:2011-05-25 13:14:12 【问题描述】:

Ok 关于 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 '。

我不确定它背后的原因,我知道解决方法是在 'Test t = 新测试()'。然而,这是一个不太理想的解决方案。 他们有什么方法可以只编辑类声明及其函数并让 for each 循环工作无类型?

【问题讨论】:

如果您使用原始类型,方法上的泛型将被忽略(请参阅最新的 Java Puzzlers 部分)。不要使用原始类型。最新版本的 javac 应该会给出警告。 感谢视频链接,他们的内容非常有趣。 > 背后的推理现在变得有意义了。 【参考方案1】:

您只需执行以下操作:

public class Test implements Iterable<Integer>

一起删除泛型类型。

您的 Test 类根本不是通用的。它只是实现一个通用接口。不需要声明泛型类型。这也将有助于消除您收到的一般警告。

@Eugene 提出了一个很好的观点。如果你真的想要一个泛型 Test 类型,你应该将 Test 声明为泛型迭代器:

您只需执行以下操作:

public class Test implements Iterable<Integer>

一起删除泛型类型。

您的 Test 类根本不是通用的。它只是实现一个通用接口。不需要声明泛型类型。这也将有助于消除您收到的一般警告。

public class Test<T> implements Iterable<T>

然后,确保在实例化 Test 时将其设为通用。

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

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

【讨论】:

【参考方案2】:

你应该这样写:

public class Test implements Iterable<Integer>
  ...

或实际生成您的类:

public class Test<T> implements Iterable<T> 

    public Iterator<T> iterator() return null;

    public static void main(String[] args) 
        Test<Integer> t = new Test<Integer>();

        Iterator<Integer> it = t.iterator();

        for(Integer i : t)
        
     

【讨论】:

正是我开始写的。 +1 是的,这可行,但您可能会遇到类似的情况。 “公共类 Vertex 实现 Iterable>”。对于图形示例。这很奇怪,但您可能会遇到这样的情况:您的可迭代对象不返回调用它的类。我的错,我解释得不好。 那是完全不同的问题。在这种情况下,您的 iterator() 方法必须返回 Iterator>,就这么简单。另一方面,您可能不需要澄清您的 Iterable 实现,只需将其声明为更通用的 implements Iterable 而不是 Iterable>。

以上是关于Java 无类型泛型类,删除它们的函数泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

Java泛型

Java泛型类

java 泛型 T的类型

Java 泛型泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )

Kotlin泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )