可归因于泛型和原始类型

时间:2015-06-11 18:24:15

标签: java generics iterable raw-types

不使用泛型类型我有以下工作正常:

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,而泛型是。

1 个答案:

答案 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) {

}