在Java中使用泛型时强制转换

时间:2014-10-16 07:25:15

标签: java generics casting

我编写了自己的Stack类(相关代码见下文)。在next() - 方法中,我被迫将current.item投射到Item,但我不知道为什么。 current.item的类型应该已经是Item,因此不需要进行投射 - 但如果我不投射,我会收到错误。

public class Stack<Item> implements Iterable<Item> {

  private class Node {
      Item item;
      Node next;
  }

  private Node first= null;

  public Iterator<Item> iterator() { return new StackIterator(); }

  private class StackIterator<Item> implements Iterator<Item> {
    private Node current = first;

    public Item next(){
        Item item = (Item)current.item;
        current = current.next;
        return item;
    }
  }
}

4 个答案:

答案 0 :(得分:7)

您在<Item>Stack上使用StackIterator作为类型参数,而您真正想做的是StackIterator没有参数,只是声明它实现了Iterator<Item>

    private class StackIterator implements Iterator<Item> {
        private Node current = first;

        @Override
        public Item next() {
            Item item = current.item; // no need to cast now
            current = current.next;
            return item;
        }
    }

答案 1 :(得分:7)

StackIterator<Item>中的类型参数隐藏了Item类的定义Stack<Item>

这就是你需要进行强制转换(或添加@SuppressWarnings("hiding")注释)的原因。

要删除警告,只需删除重复的类型:

private class StackIterator implements Iterator<Item> {

}

答案 2 :(得分:3)

您的班级StackIteratorStack的内部班级。这尤其意味着它不是静态。因此,它已经知道类型参数Item

你错误地让StackIterator拥有自己的类型参数Item。这会影响外部类的类型参数。

因此,只需从StackIterator中删除type参数:

public class Stack<Item> implements Iterable<Item> {
    private class Node {
        Item item;
        Node next;
    }

    private Node first = null;

    @Override
    public Iterator<Item> iterator() { return new StackIterator(); }

    private class StackIterator implements Iterator<Item> {
        private Node current = Stack.this.first;

        @Override
        public Item next() {
            Item item = this.current.item;
            this.current = this.current.next;
            return item;
        }
    }
}

答案 3 :(得分:1)

如果您希望<Item>中的StackIterator<Item>关联的封闭式Stack的类型相同,请删除<Item>StackIterator的声明1}}。

如果您希望<Item>中的StackIterator<Item>相关联的Stack不同,但您希望能够访问父{的Stack属性<Item> {1}},将{{1}}重命名为其他内容。