泛型和原始类型均可迭代

Iterable for both generic and raw type

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

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.

有没有可能做到两全其美?所以每个循环都有一个原始的,一个是泛型​​的。

当您使用类型参数 T 使 OC_GuillotinePacker class 通用时,您的声明就变成了原始的。

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

当您使用原始类型时,会发生类型擦除,因此 iterator() 方法现在 return 是原始 Iterator,return 是 Objects。无法将 Object 分配给 OC_GuillotinePacker,因此出现错误。

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

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

这样,iterator() 方法将 return OC_GuillotinePacker<YourType> 对象用于增强的 for 循环。

for (OC_GuillotinePacker<YourType> gp : packer) {

}