简体   繁体   中英

Why am I getting a 'source not found' error when calling a class with an interface as the argument in the constructor?

I am trying to create a few string sorting methods using an interface. The Application driver class calls the main SimplePriorityQueue object class, but it passes in a class implementing the interface as the argument when it makes this call. There are several classes implementing the interface (one to compare by length, one alphabetically (by value), one by reverse length, etc), which is why I'm told one constructor in the SimplePriorityQueue class should be able to handle them all.

When using the Eclipse debugger, the 'source not found' error pops up as soon as the Application class executes the line pq = new SimplePriorityQueue(new StringByLength()); as indicated in the code comment.

Here is what I have:


//the Interface
package cs15200.review.srijitag;

public interface Comparator {
    public int compare(Object o1, Object o2);

}

Here is one of the sorting classes. There are several more, but they are all almost exactly like this

//StringByLength class, which sorts by length
package example.cs151xx;

import java.util.Comparator;


public class StringByLength implements Comparator {

  public int compare(Object o1, Object o2)
  {
    String s1 = (String)o1;
    String s2 = (String)o2;
    return s2.length() - s1.length();
  }

  public boolean equals(Object o)
  {return (o instanceof StringByLength);}
}

//the relevant portion of the Application class

import example.cs151xx.Prompt;
import cs15200.review.srijitag.SimplePriorityQueue;

import example.cs151xx.StringByLength;
import cs15200.review.srijitag.StringByLengthReverse;
import cs15200.review.srijitag.StringByValue;
import cs15200.review.srijitag.StringByValueIgnoreCase;
import cs15200.review.srijitag.IntegerIncreasing;

import java.util.Comparator;


public class Application {

  ////////////////
  //Driver Program
  ////////////////

    public static void main(String[] args)
    {
    //Construct object to test; let the user specify what Comparator
    //  object to construct to order the priority queue

      SimplePriorityQueue pq;
      char howPrioritize = Prompt.forChar("Enter how to prioritize queue\n  v (by value)\n  i (value ignore case)\n  l (by length)\n  r (by reverse length)\n\nChoice","virl");
      if (howPrioritize == 'v')
        pq = new SimplePriorityQueue(new StringByValue());
      else if (howPrioritize == 'i')
        pq = new SimplePriorityQueue(new StringByValueIgnoreCase());
      else if (howPrioritize == 'l')
        pq = new SimplePriorityQueue(new StringByLength()); //ERROR THROWN
      else
        pq = new SimplePriorityQueue(new StringByLengthReverse());

[...more code to finish up rest of driver class]

//The relevant parts SimplePriorityQueue class which has the constructors, accessors, and methods

package cs15200.review.srijitag;

import example.cs151xx.StringByLength;
import java.util.Comparator;

public class SimplePriorityQueue{
    public SimplePriorityQueue(Comparator whatever){
        check = whatever;
    }

    public void enqueue(Object item){

        if(list.length==rear+1)
            doubleSize();
        if (rear==-1)
            list[0]=item;
        else{
            for(int i=rear;i>=0;i--){
                int z = check.compare(item,list[i]);
                if(z<=0){
                    list[i+1]=list[i];
                    list[i]=item;                       }
                else{
                    list[i+1]=item;
                }
            }
        }
        rear++;
    }

[...more accessors and mutators]

          //instance variables
    private Object[] list=new Object[1];
    private int rear=-1;
    private Comparator check;


}

I know this basic format (passing in as an argument the an object that implements the interface, and using as a parameter an object of the type of that interface) should work because I successfully tried the following simple example:

package  cs15200.review.srijitag;
import example.cs151xx.StringByLength;
import java.util.Comparator;

public class temp {


    public static void main(String[] args) {
        Comparator z = new StringByLength();
        System.out.println( z.compare("hi", "what's up"));
        Comparator y = new StringByValue();
        System.out.println(y.compare("hi", "what's up"));

        System.out.println( lookee(new StringByLength())); //should return the same result as z.compare(...)
        System.out.println(lookee(new StringByValue())); //should return the same result as y.compare(...)
    }

    public static int lookee(Comparator test){
        return test.compare("hi", "what's up");

    }
}

So what am I doing wrong in the constructor in the SimplePriorityQueue class? Thanks in advance for your help.

您实现了java.util.Comparator而不是cs15200.review.srijitag.Comparator ,其中在调试时找不到java.util.Comparator源。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM