泛型和原始类型均可迭代
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 是 Object
s。无法将 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) {
}
在不使用通用类型的情况下,我有以下工作正常的方法:
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 是 Object
s。无法将 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) {
}