2014-10-16 16 views
5

Tôi đã viết lớp Stack của riêng mình (cho mã có liên quan, xem bên dưới). Trong số next() -method, tôi buộc phải bỏ current.item đến Item, nhưng tôi không biết tại sao. Loại current.item phải là Item và do đó việc truyền không cần thiết - nhưng nếu tôi không truyền, tôi sẽ gặp lỗi.Cast bị ép khi sử dụng Generics trong Java

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; 
    } 
    } 
} 
+0

Bạn có thể gửi báo lỗi? – DeepInJava

+0

@SanketPipariya: Loại không phù hợp: không thể chuyển đổi từ Mục sang Mục – Mina

+0

@Override trên phương thức tiếp theo trong StackIterator nên giải quyết vấn đề ur .. – SamDJava

Trả lời

7

Các loại tham số từ StackIterator<Item> ẩn loại Item, được giới thiệu trong định nghĩa của lớp Stack<Item>.

Đây là lý do tại sao bạn cần thực hiện một dàn diễn viên (hoặc để thêm chú thích @SuppressWarnings("hiding")).

Để thoát khỏi cảnh báo, chỉ cần loại bỏ các loại trùng lặp:

private class StackIterator implements Iterator<Item> { 

} 
7

Bạn đang sử dụng <Item> như một tham số kiểu trên cả StackStackIterator, trong khi những gì bạn thực sự muốn làm là có StackIterator mà không có một tham số và chỉ rõ rằng nó thực hiện 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

Nếu bạn muốn <Item> trong StackIterator là loại giống như kèm theo <Item> gắn liền với Stack, loại bỏ các tuyên bố <Item> trong StackIterator.

Nếu bạn muốn <Item> trong StackIterator là khác nhau hơn so với kèm theo <Item> gắn liền với Stack, nhưng bạn muốn để có thể truy cập vào tính chất của phụ huynh Stack, đổi tên <Item> đến cái gì khác.

3

Lớp học của bạn StackIterator là lớp bên trong là Stack. Điều đó đặc biệt có nghĩa là nó không phải là tĩnh. Do đó nó đã biết về tham số kiểu Item.

Bạn đang mắc lỗi khi tạo StackIterator có thông số loại riêng Item. Điều này đổ bóng tham số kiểu của lớp bên ngoài.

Vì vậy, chỉ cần loại bỏ các tham số kiểu từ StackIterator:

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; 
     } 
    } 
} 
+0

rất thú vị! Cảm ơn lời giải thích. – Mina

Các vấn đề liên quan