0

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

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。

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

4

1 回答 1

4

当您OC_GuillotinePacker使用 type parameter 使您的类成为通用类时T,您的声明就变成了原始的。

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

当您使用原始类型时,会发生类型擦除,因此该iterator()方法现在返回一个 raw Iterator,它返回Objects。AnObject不能分配给 a OC_GuillotinePacker,因此出现错误。

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

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

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

for (OC_GuillotinePacker<YourType> gp : packer) {

}
于 2015-06-11T18:30:37.567 回答