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

问题描述:

我实现了一个java类,但是出现了两个我无法修复的错误。 ERROR1:错误:java类中的不兼容类型

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); 
     } 
    } 
} 
+2

没有堆栈跟踪,看起来像编译错误... – WarrenFaith

+0

@luojiebin错误是什么行? –

+1

我建议正确使用基本的java命名约定。类名以大写字母开头,变量名称以较低字母和方法开头。这会让你的代码更容易阅读! – WarrenFaith

对于第一个错误,您尝试将ob的值设置为ob.nextobNode,但是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类,你需要IndepentRandomIterator()这样的前右侧添加关键字new

return new IndepentRandomIterator(); 

有关此行的错误:

ob.next.last = temp; 

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


接近代码结束时,您尝试使用StdOut.println()StdOut不存在;你应该使用System.out.println()

的第一个错误不能被诊断为你没有提供Node类的实现

第二个错误:

你不会创造你的课堂实例。

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

我投了票,因为它至少解释了两个错误之一 – WarrenFaith

+0

@WarrenFaith *五个错误之一。看到我的答案。 –

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

首先,在类的第一行:

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

Item实际类的名称,或者是它的一类的占位符?

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

如果项目是一个通用占位符,那么你需要定义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,在开始使用泛型之前,你确实需要了解它。