gpt4 book ai didi

java - 对于泛型和原始类型都是可迭代的

转载 作者:行者123 更新时间:2023-12-01 18:14:05 25 4
gpt4 key购买 nike

在不使用泛型类型的情况下,我可以使用以下方法正常工作:

public class OC_GuillotinePacker implements Iterable<OC_GuillotinePacker> {
@Override
public Iterator<OC_GuillotinePacker> iterator() {
// code that returns a new Iterator
}
}

这允许我像这样循环:

for (OC_GuillotinePacker gp : packer) {

}

我更新了代码,以便可以通过通用类型存储对象。现在就像:

public class OC_GuillotinePacker<T> implements Iterable<OC_GuillotinePacker<T>> {
@Override
public Iterator<OC_GuillotinePacker<T>> iterator() {
// code that returns a new Iterator
}
}

问题是当我创建一个新的 OC_GuillotinePacker 时,例如:

packer = new OC_GuillotinePacker(0, 0, width, height); 

然后我就不能再像这样循环了:

for (OC_GuillotinePacker gp : packer) {

}

它给了我一个不兼容的类型警告。需要的是 OC_GuillotinePacker<>,找到的是 java.lang.Object。

是否可以做到两者皆有可能?因此,每个循环都有一个原始循环,还有一个具有通用类型的循环。

最佳答案

当你创建OC_GuillotinePacker时类泛型,带有类型参数 T ,你的声明就变成了原始声明。

packer = new OC_GuillotinePacker(0, 0, width, height);

当您使用原始类型时,会发生类型删除,例如 iterator()方法现在返回原始 Iterator ,返回 Object s。安Object无法分配给 OC_GuillotinePacker ,因此出现错误。

创建 OC_GuillotinePacker 时,提供类型参数或使用菱形运算符从 packer 推断类型变量声明。

packer = new OC_GuillotinePacker<>(0, 0, width, height);

这样,iterator()方法将返回 OC_GuillotinePacker<YourType>在增强中使用的对象for循环。

for (OC_GuillotinePacker<YourType> gp : packer) {

}

关于java - 对于泛型和原始类型都是可迭代的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30788590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com