2016-11-22 88 views
0

只是想知道這個錯誤意味着什麼,我應該如何解決這個問題。試圖實現接口比較

錯誤:類學生必須實現繼承的抽象方法java.lang.Comparable.compareTo(java.lang.Object中)

我想實現這個,所以我可以使用類的compareTo方法。

非常感謝您的幫助!

import java.util.*; 
import java.io.*; 

public class Student implements Comparable 
{ 
private String name; 
private double gpa; 
public Student() 
{ 
    name = ""; 
    gpa = 0.0; 
}//end default constructor 

public Student(String n, double g) 
{ 
    name = n; 
    gpa = g; 
}//end two arg constructor 

public double getGPA() 
{ 
    return gpa; 
} 

public String getName() 
{ 
    return name; 
} 

public void setGPA(double g) 
{ 
    this.gpa = g; 
} 

public void setName(String n) 
{ 
    this.name = n; 
} 

public String toString() 
{ 
    return " Name: " + name + " GPA: " + gpa; 
} 

public static void compareTo() 
{ 


} 
}//end class 

回答

0

您必須對代碼進行以下更改才能正確實現Comparable接口。

(1)指定的對象的類型的類是比得上:

public class Student implements Comparable<Student> 

(2)和所述compareTo方法的相應的簽名是如下:

public int compareTo(Student other) 

當然而您也必須執行compareTo方法的主體。

  • 如果this實例比參數other「小」,那麼compareTo應該返回號。
  • 如果this實例比參數other「大」,那麼compareTo應該返回一個正數數字。
  • 如果this實例被認爲與參數other具有「相同的值」,則compareTo應返回0

有關實施細節的更多信息,請參閱official java document

2

您所要做的就是實現可比接口並覆蓋要排序的類中的compareTo()方法。在compareTo方法內部,你必須提到你的對象應該在哪個基礎上排序。下面的代碼將有助於在此:

public class Student implements Comparable<Student> 
{ 
private String name; 
private double gpa; 
public Student() 
{ 
    name = ""; 
    gpa = 0.0; 
}//end default constructor 

public Student(String n, double g) 
{ 
    name = n; 
    gpa = g; 
}//end two arg constructor 

public double getGPA() 
{ 
    return gpa; 
} 

public String getName() 
{ 
    return name; 
} 

public void setGPA(double g) 
{ 
    this.gpa = g; 
} 

public void setName(String n) 
{ 
    this.name = n; 
} 

public String toString() 
{ 
    return " Name: " + name + " GPA: " + gpa; 
} 

public Integer compareTo(Student student) 
{ 
// if object is getting sorted on the basis of Name 
    return this.getName().compareTo(student.getName()) 
// if object is getting sorted on the basis of gpa 
    return Double.valueOf(this.gpa).compareTo(Double.valueOf(student.getGPA())); 
} 
}//end class 

由於您使用的原始數據類型的雙代替雙精度的對象,所以我們需要使用Double.valueOf(this.gpa)來獲取對象 你應該只使用一個根據您的要求返回聲明。

+2

你的代碼不會編譯,'compareTo'不應該是'static'方法,你不能'static'方法引用'this' – chiwangc

0

請注意,Interface Comparable<T>是一個通用接口。這裏的T是type(Class,Interface居多)。你想比較Student與另一種類型(Student)。

所以你必須通過類型(TStudentComparable<T>

因此將其更改爲

public class Student implements Comparable<Student> 

必須另一點實現Comparable<T>接口同樣的方法簽名和返回類型Student類。

public int compareTo(Student anotherStudent) 

你已經寫

public static void compareTo() 

其不遵守接口Comparable<T>方法簽名和Student類返回類型

在這裏你應該實現你的領域特定的邏輯。我不知道你想如何實現它?您可以按字母順序或基於CGPA來比較名稱。

+0

你的代碼不會編譯,'compareTo'應該具有'public'的可訪問性,在重寫方法時,您不能指定較弱的訪問權限 – chiwangc

+0

@chiwangc tnx :) –