错误:java类中的不兼容类型

时间:2014-03-13 12:48:29

标签: java incompatibletypeerror

我实现了一个java类,但是出现了两个我无法解决的错误。 ERROR1:

incompatible types
Required: RandomizedQueue<Item>
Found:    Item

误差2:

can not find symbol
Symbol: valuable last
location:valuable next of type Item
public class RandomizedQueue<Item> implements Iterable<Item> {
    private int number=0;
    private Node First=null;
    private class Node {
        Item item;
        Item next=null;
        Item last=null;
    }
    private Node Random() {
        double r = Math.random();
        int n = (int) (r*number);
        if(n==0) n=1;
        Node ob=First;
        for(int i=0;i<(n-1);i++) {
            ob = ob.next;   //Error1
        }
        return ob;
    }

    public RandomizedQueue() {
        Node empty=new Node();
    }
    public boolean isEmpty() {
        return number==0;
    }
    public int size() {
        return number;
    }
    public void enqueue(Item item) {
        if(item==null) throw new NullPointerException();
        Node oldfirst = First;
        First = new Node();
        First.item = item;
        First.next = oldfirst; //Error1
        oldfirst.last = First;
        number++;
    }
    public Item dequeue() {
        Node ob=Random();
        Item back = ob.item;
        Node temp = ob.last;
        temp.next = ob.next;
        ob.next.last = temp;   //Error2
        return back;
        }
    public Item sample() {
        return Random();
    }
    public Iterator<Item> iterator() {       //Error:cannot find symbol symbol:class Itertor
        return IndepentRandomIterator();
    }
    private class IndepentRandomIterator implements Iterator<Item> {
        private RandomizedQueue<Item> iq = new RandomizedQueue<Item>();
        Node scan = First;
        public IndepentRandomIterator() {
            while(scan != null) {
                iq.enqueue(scan.item);
                scan=scan.next;
        }
        }
        public boolean hasNext() {
            return iq.number >0;
        }
        public void remove() {
            throw new UnsupportedOperationException();
        }
        public Item next() {
            if(iq.number==0) throw new java.util.NoSuchElementException();
            return iq.dequeue();
        }
    }
    public static void main(String[] args) {
        RandomizedQueue<String> test = new RandomizedQueue<String>();
        test.enqueue("Luo");
        test.enqueue("Jiebin");
        test.enqueue("is");
        test.enqueue("genious");
        test.dequeue();
        test.dequeue();
        StdOut.println("Is it empty?"+test.isEmpty());
        StdOut.println("Size:       "+test.size());
        StdOut.println("A sample:   "+test.siample());
        Iterator<String> it = test.iterator();
        while(test.hasNext()) {
            String s = it.next();
            StdOut.println(s);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

由于您没有提供Node class

的实现,因此无法诊断第一个错误

第二个错误:

你不会创建你班级的实例。

 public Iterator<Item> iterator() {       //Error:cannot find symbol symbol:class Itertor
        return IndepentRandomIterator();
    }

你必须提供一个能够返回的机会。

 public Iterator<Item> iterator() {       //Error:cannot find symbol symbol:class Itertor
        return new IndepentRandomIterator();
    }

答案 1 :(得分:1)

我收到了2个以上的编译错误。

首先,在班级的第一行:

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

Item实际类的名称,还是类的占位符?

如果它是一个类,那么你的第一个错误是抱怨它在这个类上找不到“next”字段 - 可能它没有定义或不可见。

如果Item是通用占位符,那么您需要像这样定义RandomizedQueue:

public class RandomizedQueue<Item extends MyClass> implements Iterable<Item> {

MyClass确实有一个名为next的可见字段

其次,代码:

    Node oldfirst = First;
    First = new Node();
    First.item = item;
    First.next = oldfirst; //Error1

在我看来,您正在尝试将节点转换为项目。但究竟什么是Item,它与Node有什么关系?

我无法看到你在这里想做什么。 您似乎并不真正理解inheritance,在开始使用泛型之前,您确实需要了解它。

答案 2 :(得分:1)

对于第一个错误,您尝试为ob分配ob.next的值。 obNode,但ob.nextItem。显然,Item不是Node,因此您无法将Item分配给Node

同样适用于该行:

first.next = oldfirst;

first.nextItem,但oldFirstNode。您无法将Node分配给Item类型的变量。


对于错误cannot find symbol symbol:class Itertor。那是因为您需要将它放在代码的最顶层:

import java.util.Iterator;

在线:

return IndepentRandomIterator();

代码尝试调用方法IndepentRandomIterator()。要让它调用IndepentRandomIterator类的构造函数,您需要在new之前添加关键字IndepentRandomIterator(),如下所示:

return new IndepentRandomIterator();

对于这行的错误:

ob.next.last = temp;

代码尝试访问对象last的字段ob.next。我想你想访问对象ob.last。但这仍然是一个问题,因为那样你就会得到第一个错误。 ob.nextob.last都属于Item类型,但temp属于Node


在代码末尾,您尝试使用StdOut.println()StdOut不存在;你应该使用System.out.println()