質問

Employee の基本クラスと Employee を拡張する Manager のサブクラスがあるとします。次に、Employee 型のオブジェクト x と Manager 型のオブジェクト y を作成して呼び出したとします。 x.compareTo(y) 例外はトリガーされず、x と y は Employees として比較されます。つまり、y は Employee にキャストされますが、呼び出したとき y.compareTo(x) classCastException が発生しました。これが発生する理由と、x と y が異なるクラスにあるため x.compareTo(y) が実行されないようにする方法を知る必要があります。私のアイデアは、次のように Reflection クラスで getclass() メソッドを使用することです。

if (getClass() != other.getClass()) 
throw new ClassCastException();

また、これを実装する他の方法があるかどうかも知りたいです。

役に立ちましたか?

解決

クラスcompareTo()Employeeを実装して、次のようにします。

Employee o = (Employee)other;
.

は、thisoの比較を続行します。

他のヒント

なぜならあなたの Manager is an Employee しかし Employee is not a Manager 以下を参照してください

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

instance of このような場合に役立ちます

ここ Manager です Employee.

しかし Employee ではありません Manager.

『Effective Java』の項目 12 からの引用:

CompareTo 契約の条項を見てみましょう。最初の条項は、2 つのオブジェクト参照間の比較の方向を逆にすると、期待どおりのことが起こると述べています。最初のオブジェクトが 2 番目のオブジェクトより小さい場合、2 番目のオブジェクトは最初のオブジェクトより大きくなければなりません。最初のオブジェクトが 2 番目のオブジェクトと等しい場合、2 番目のオブジェクトは最初のオブジェクトと等しくなければなりません。最初のオブジェクトが 2 番目のオブジェクトより大きい場合、2 番目のオブジェクトは最初のオブジェクトより小さい必要があります。2 番目の規定は、1 つのオブジェクトが 2 番目のオブジェクトより大きく、2 番目のオブジェクトが 3 番目のオブジェクトより大きい場合、最初のオブジェクトは 3 番目のオブジェクトより大きくなければならないと規定しています。最後の規定は、等しいとして比較されるすべてのオブジェクトは、他のオブジェクトと比較したときに同じ結果を生じなければならないと規定しています。

これら 3 つの規定の結果の 1 つは、acompareTo メソッドによって課される等価性テストは、equals コントラクトによって課されるのと同じ制限に従わなければならないということです。反射性、対称性、推移性。したがって、同じ警告が適用されます。オブジェクト指向の抽象化 (項目 8) の利点を積極的に放棄しない限り、compareTo コントラクトを保持しながら、新しい値コンポーネントでインスタンス化可能なクラスを拡張する方法はありません。同じ回避策も適用されます。Comparable を実装するクラスに値コンポーネントを追加する場合は、それを拡張しないでください。最初のクラスのインスタンスを含む無関係なクラスを作成します。次に、このインスタンスを返す「view」メソッドを提供します。これにより、必要に応じてクライアントが 2 番目のクラスのインスタンスを最初のクラスのインスタンスとして表示できるようにしながら、2 番目のクラスに任意の CompareTo メソッドを自由に実装できるようになります。

すべてのManagerEmployeeですが、すべてのEmployeeManagersではありません。Employeeのすべての属性はManagerで使用可能なので、ManagerEmployeeにキャストできます。しかし、Managerの属性はEmployeeには使用できないので、キャストはできません。

私の提案は、クラス内のcompareTo()メソッドをオーバーライドし、オブジェクトEmployeeをキャストすることです。

If your are using compareTo method then i am excepting you have implemented Comparable interface in your class and provide a implementation of the method compareTo. let me know how you are comparing object on what logic ,based on that only you get the solution.

I have little bit confuse on this 
if (getClass() != other.getClass()) 
throw new ClassCastException();

if it is the code in your compareTo method then rather then doing this create one more interface say "XYZ" and implement that Interface to both the class
check the logic 


    public int compareTo(T obj){
    if(this instanceof XYZ &&  obj instanceof XYZ)){
return 0;
    }else{
    throw new ClassCastException();
    }
    }
.

あなたはおそらくIsAssignablefromを使うことができます。しかし

とにかく、名称、社員の給与、マネージャの給与、ならびに例えば比較の一環として給与を比較するだけでさらに給与を比較したものです。

public class Test{   
    public static void main(String[] args) {
        class Employee implements Comparable<Employee> {
            public Employee(String string, int salary) {
                this.name = string;
                this.salary = salary;
            }

            public Employee() {
                name = "";
                salary = 0;
            }

            String name;
            Integer salary;

            public int compareTo(Employee o) {
                return o!=null && getClass().isAssignableFrom(Employee.class)
                        ? salary.compareTo(o.salary) : Integer.MIN_VALUE;
            }

        }

        class Manager extends Employee {
            public Manager(String name, String[] subordinates) {
                super(name, 1000000);
                reportees = subordinates;
            }

            String[] reportees;
        }

        Employee e = new Employee("me", 1000);
        Employee e1 = new Employee("mycolleague", 2000);
        Manager m = new Manager("myboss", "me mycolleague".split(" "));
        System.out.println(e1.compareTo(e));
        System.out.println(e.compareTo(m));
        System.out.println(m.compareTo(e)); // this gives INT.MIN as you cannot compare manager to employee
    }

}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top