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以上是关于Java 无类型泛型类,删除它们的函数泛型类型的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )
Java 泛型泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
Kotlin泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )