不使用泛型类型我有以下工作正常:
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&lt;&gt;并找到了java.lang.Object。
是否有可能使两者都成为可能?所以每个循环都是raw,而泛型是。
答案 0 :(得分:4)
当您使用类型参数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) {
}