【问题标题】:Weird Java compiler error (Error:(65, 23) java: incompatible types: Bag<Item>.Node<Item> cannot be converted to Bag<Item>.Node<Item> ) [duplicate]奇怪的 Java 编译器错误(错误:(65、23)java:不兼容的类型:Bag<Item>.Node<Item> 无法转换为 Bag<Item>.Node<Item>)[重复]
【发布时间】:2015-11-13 18:29:03
【问题描述】:

我很困惑。我无法将外部类的实例变量 Node first 分配给内部类的实例变量 Node current。 编译器抱怨存在不兼容的类型。如果我应用演员表,它会起作用。这里发生了什么。

import java.util.*;
import java.lang.Iterable;

class Bag<Item> implements Iterable<Item> {

    private class Node<Item> {
        private Item item;
        private Node<Item> next;
    }

    private Node<Item> first;
    private int size;

    public Bag() {
        first = null;
        size = 0;
    }

    public void add(Item item) {
        Node<Item> oldNode = first;
        Node<Item> newNode = new Node<>();
        newNode.item = item;
        newNode.next = oldNode;
        first = newNode;
        size++;
    }

    public boolean isEmpty() { return first == null; }
    public int getSize() { return size; }

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

    private class ListIterator<Item> implements Iterator<Item> {
        private Node<Item> current;

        public ListIterator(Node<Item> node) {
            // Error is here Error:(65, 23) java: incompatible           types:             Bag<Item>.Node<Item> 
            //cannot be converted to Bag<Item>.Node<Item>
            // current and first are of the same type (Node<Item>).
            // What is the problem, why shall I apply when the types are the same.
            current = first; 
        }

        @Override
        public boolean hasNext() {
            return current != null;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("remove");
        }

        @Override
        public Item next() {
            if (!hasNext()) throw new NoSuchElementException();
            Item item = current.item;
            current = current.next;
            return item;
        }
    }

    public String toString() {
        StringBuilder s  = new StringBuilder();
        Iterator<Item> it = iterator();
        while (it.hasNext())
            s.append(it.next() + " ");

        return s.toString();
    }
}

public class Main {

    public static void main(String[] args) {
        int data[] = new int[5];
        Bag<Integer> bag = new Bag<>();

        for (int i = 0; i < data.length; i++)
            data[i] = new Random().nextInt(1000);

        //Arrays.sort(data);
        System.out.println(Arrays.toString(data));

        for (int i = 0; i < data.length; i++)
            bag.add(data[i]);

        System.out.println( "Size: " + bag.getSize() );
        System.out.println( bag );

    }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    改变

    private class Node<Item> {
    
    private class ListIterator<Item> implements Iterator<Item> {
    

    private class Node {
    
    private class ListIterator implements Iterator<Item> {
    

    【讨论】:

    • 感谢bayou.io的回答。我认为私有类 Node 应该保持通用,因此您的解决方案不适用。
    • 该类不需要保持通用,因为它从Bag 继承了Item 类型参数。
    • 谢谢bayou.io 和Clashsoft。我已经查看了我的代码,私有类 Node 不需要是通用的。该代码适用于新更改。
    猜你喜欢
    • 2015-04-04
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2021-02-11
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多