关于 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/