1
import java.util.*;

public class Employee
{
    private int empId;
    private String name;
    private int age;
    public Employee(String name, int id, int age )
    {
        this.name = name;
        this.empId = id;
        this.age = age;
    }
    public int getId()
    {
        return empId;
    }
    public int getAge()
    {
        return age;
    }
    public String getName()
    {
        return name;
    }

}

class SortById extends Employee implements Comparable<SortById>
{
    public SortById(String name, int id, int age)
    {
        super(name, id, age);
    }
    public int compareTo(SortById other)
    {
        if (this.getId() > other.getId()) return 1;
        if (this.getId() < other.getId()) return -1;
        return 0;

    }
}

class SortByName extends Employee implements Comparable<SortByName>
{
    public SortByName(String name, int id, int age)
    {
        super(name, id, age);
    }

    public int compareTo(SortByName other)
    {
        if (this.getName().compareTo(other.getName()) > 0) return 1;
        if (this.getName().compareTo(other.getName()) < 0) return -1;
        return 0;

    }
}

class Test
{
    public static void main(String args[])
    {
        Employee[] array = new SortById[3];
        array[0] = new SortById("Gautam", 1222, 20);
        array[1] = new SortById("Shivam", 1221, 20);
        array[2] = new SortById("Ankit", 1223, 21);
        System.out.println(array[0] instanceof SortByName);

        Arrays.sort(array);
        for (int i = 0; i < array.length; i++)
            System.out.println("ID: " + array[i].getId() + " Name: " + array[i].getName() + " Age: " + array[i].getAge());
        Employee[] array2 = new SortByName[3];
        array2[0] = new SortByName("Gautam", 1222, 20);
        array2[1] = new SortByName("Shivam", 1221, 20);
        array2[2] = new SortByName("Ankit", 1223, 21);
        Arrays.sort(array2);
        for (int i = 0; i < array2.length; i++)
            System.out.println("ID: " + array2[i].getId() + " Name: " + array2[i].getName() + " Age: " + array2[i].getAge());

    }
}

このプログラムは正常に実行されます。パラメータ化されたバージョンのを使用しているので、質問したかったのですがComparable、渡す参照compareToSortByIdタイプまたはSortByNameタイプのどちらである必要がありますか?

参照がタイプの場合でも、そのサブクラス(または)Employeeを指していても、コードは正常に実行されます。SortByNameSortById

暗黙のキャストはどのように発生しますか?私が読んだことはできません。つまり、スーパークラス型をサブクラスに暗黙的にキャストすることはできません。

4

1 に答える 1

2

compareToキャストが必要ない理由を説明する電話をかけることはありません。実際の呼び出しはArrays.sort、(実際にrawを使用してComparable)それを処理する範囲内にあります

また、このような場合、コンパイラーは2つcompareToのメソッドを生成します。1つはパラメーターで明示的に定義し、SortByXXもう1つObjectは最初のメソッドに委任するパラメーターを使用します。

@martijnoが言うように、Employee配列に単純なものを追加すると問題が発生し、 ClassCastException(からまたはEmployeeのいずれComparableかにSortByXX)が発生します。とを混ぜSortByNameても同じことが起こりますSortById

于 2013-01-04T14:01:50.113 に答える