Java中的迭代器变量前面的括号是什么?

时间:2014-05-31 11:24:21

标签: java syntax

    for (Iterator i = guitars.iterator(); i.hasNext(); )
    {
        Guitar guitar = (Guitar)i.next();
        if (guitar.getSerialNumber().equals(serialNumber))
        {
            return guitar;
        }
    }

我无法理解 (Guitar)i.next() 正在做什么。看起来好像Guitar被传递给函数(...),但我猜测并且没有任何线索。同样不容易为这种构造制定搜索查询,所以请原谅可能重复的问题。

4 个答案:

答案 0 :(得分:2)

这是一个演员陈述。原因是i.next()返回Object,但您知道它将是Guitar,所以您告诉编译器:

  

"嘿,编译器,我知道它会成为Guitar,相信我。"

这样做的巧妙方法是使用泛型。你基本上都是这样做的,但它更干净:

for (Iterator<Guitar> i = guitars.iterator(); i.hasNext(); )
{
     Guitar guitar = i.next();
     //...
}

答案 1 :(得分:2)

(Guitar)i.next();强制转换操作符。这里有必要,因为i.next()会返回java.lang.Object,但您知道它是Guitar,并且您想要使用Guiter的属性。

请注意,如果guitars是泛型集合,则不需要强制转换,在这种情况下,可以正确键入迭代器:

List<Guitar> guitars = ...
for (Iterator<Guitar> i = guitars.iterator(); i.hasNext(); ) {
    Guitar guitar = i.next(); // <<== The cast is no longer necessary
    if (guitar.getSerialNumber().equals(serialNumber))
    {
        return guitar;
    }
}

答案 2 :(得分:0)

(Guitar)i.next();

是对类Guitar的对象的强制转换,因为i.next()以原始IteratorObject返回,但编译器需要知道您有{{1} - 使用obejct来使用Guitar - 类特定方法。

答案 3 :(得分:0)

你可以像其他人所说的那样投射i.next()。我认为guitars是一个列表,所以你也可以使用FOR EACH循环来迭代它:

    for (Guitar guitar : guitars) {
        if (guitar.getSerialNumber().equals(serialNumber))
        {
            return guitar;
        }
    }