2012-03-01 2 views
0

Я выполняю назначение для класса, где мы сравниваем массив объектов Customer, а затем предлагаем пользователю несколько методов. Я продолжаю получать сообщение об ошибке «Клиент не является абстрактным и не отменяет абстрактного метода compareTo (Customer) в java.lang.Comparable. Прошу прощения, если это было рассмотрено на этом форуме, но мне не удалось найти ответ, который сделал все это бы бессмысленно.Проблемы с ошибками в реализации Comparable

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.Scanner; 


class prog4 { 
public static void main(String args[]) 
      throws FileNotFoundException 
{ 
Scanner kb=new Scanner(System.in); 

Customer [] A =readArray(); //read data into objects in A 

while(true) 
{ 
    System.out.println(); 
    System.out.println(); 
    System.out.println("Please select one of the follwing actions: "); 
    System.out.println("q - Quit"); 
    System.out.println("a - List the customer records sorted by customer name"); 
    System.out.println("b - Enter a customer name to find the customer's record"); 
    System.out.println("c - List the customer records sorted by purchase in descending order"); 
    System.out.println("Please enter q, a, b, or c: "); 

    String selection=kb.nextLine(); //read user's selection 
    if (selection.equals("")) continue; //break; //if selection is "", show menu again 

    switch (selection.charAt(0)) 
    { 
    /*write code to process the following cases*/ 

    case 'a': 

      break; 

    case 'b': 

      break; 

    case 'c': 

      break; 

    case 'q': 

      return; 

    default: 
    } //end switch 
} //end while 
} //end main(); 


    //the following method uses the data from indata.txt 
    //to create Customer objects of an array 
    //and returns the array 

    private static Customer[] readArray() 
        throws FileNotFoundException 
    { 
    String name; 
    double purchase; 
    double rebate; 

    Scanner infile=new Scanner(new File("indata.txt")); //input file 

    int size=infile.nextInt(); //get number of lines 
    infile.nextLine();   //skips end of line 

    Customer A[]=new Customer[size]; 

    for (int k=0; k<size; k++) 
    { 
     //read a name = 16 characters 
     infile.useDelimiter(""); 
     name=""; 

     for (int i=0; i<16; i++) name=name+infile.next(); 
     infile.reset(); 

     purchase=infile.nextDouble(); 
     rebate=infile.nextDouble(); 
     if (infile.hasNextLine()) infile.nextLine(); //skip end of line 

     A[k]=new Customer(name, purchase, rebate); //create object for A[i] 

    } //end for loop 

    infile.close(); 
    return A; 

    } //end readArray 

    //the method prints the Customer objects of the array A 
    //one customer record per line 
    private static void printArray(Customer [] A) 
    { 
    for (Customer x:A) 
    {System.out.println(x);} 
    } //end printArray 
} //end class prog4 


class Customer implements Comparable<Customer> 
{ 
    String name; 
    double purchase; 
    double rebate; 

    public Customer(String n, double p, double r) 
    { name=n; 
    purchase=p; 
    rebate=r; 
    } //end Constructor 

    public Customer(String n) 
    { 
    name=n; 
    } //end Constructor 

    public String toString() 
    { 
    return String.format("%-20s%10.2f%10.2f", name, purchase, rebate); 
    } 

public int compareTo(Customer a, Customer b) 
{return b.name.compareTo(a.name);} 
    } 
//end class Customer 

class descendingPurchase implements Comparator<Customer> 
{ 
public int compare(Customer a, Customer b) 
    { 
    if(a.purchase<b.purchase) return 1; 
    else if(a.purchase==b.purchase) return 0; 
    else return -1; 
    } 
} 
+0

вы получите ошибку компиляции? – lolo

ответ

0

Согласно документу интерфейса Comparable<T>, метод, который вы должны переопределить это

public int compareTo(T o) 

, в котором первый объект для сравнения this.

Вы определяете

public int compareTo(Customer a, Customer b) 

который не отменяет правильный метод. Вот почему компилятор Java жалуется на то, что вы заявили, что Customer реализует Comparable<Customer>, но на самом деле у вас отсутствует правильный метод.

Последний метод, необходимый для Comparator<Customer>, который предлагает ту же функциональность, что и «объект-независимый» способ.

1

Ваш класс Customer реализует Comparable<Customer>:

class Customer implements Comparable<Customer> 

, который требует, чтобы вы реализуете следующий метод

public int compareTo(Customer that) 

Примечание единственный аргумент. Предполагается сравнить this с that.

0

, когда вы реализуете интерфейс ДОЛЖЕН использовать именно данную подпись метода. Цель внедрения интерфейсов - дать другим понять, что вы внедрили необходимые им необходимые методы. В вашем случае у вас есть метод, который имеет одно и то же имя, объявленное в интерфейсе, но не тот, который ожидается классами, которые знают, как обращаться с Comparable.

Представьте, что вам нужно написать класс, который вызывает метод compareTo для других объектов. Вы ожидаете передать один параметр (типа T), и люди продолжают реализовывать свою собственную версию со всеми видами параметров (строки, ints, Comparables и т. Д.) И их количество, например compareTo(boolean b, String s, int minMatches)

compareTo(float f, boolean caseSensitive)

Как вы узнали, какой из них назвать?

Смежные вопросы