0

2 つのサブクラス (学生、教師) とスーパークラス (職業) があります。
生徒からオブジェクト A を作成し、教師からオブジェクト B を作成しました。

Student A = new Student();
Teacher B = new Teacher();

そして、オブジェクトを引数として取り、ブール値を返す静的メソッドを既に作成しました。

compare(A, B);

public static boolean compare(Student s, Teacher t)

メソッドでは、両方のオブジェクトが同じクラスに属しているかどうかを比較するために、このコードを挿入しました。

if (s.getClass() == t.getClass())

そして今、私は次のようなエラーを受け取ります:

incomparable types: Class<CAP#1> and Class<CAP#2>

ここで、CAP#1、CAP#2 は新しい型変数です:

CAP#1 extends Student from capture of ? extends Student
CAP#2 extends Teacher from capture of ? extends Teacher

ここで何が問題なのですか?

注: 比較 s.equals(t) を使用すると、エラーはまったく発生しません。object.getClass() メソッドを正しく使用できないのはなぜですか?

4

2 に答える 2

1

class Student extends Occupationとの場合、aとaのclass Teacher extends Occupation両方であるクラスはありません。したがって、それらを比較しようとしても意味がありません。常にfalseを返します。StudentTeachers.getClass() == t.getClass()

コンパイラはそれを検出できます。これは、任意のタイプTに対して、をT.getClass()返すためClass<? extends T>です。Class<? extends Student>そしてClass<? extends Teacher>、決して互いに等しくなく、したがって比類のないものです。

それらを比較したい場合は、型が実際に比較可能であることをコンパイラーに納得させる必要があります。メソッドのシグネチャを(@Seismoidによって提案されているように)、compare( Object o1, Object o2)または明示的なアップキャストによって、Class<?>または(ここで生のタイプの警告Classを感知します)または:に変更できます。Object

return ((Class<?>) s.getClass()) == ((Class<?>) t.getClass());

なぜs.equals(t)機能するのかによると、これはの署名がであるためであり、でT.equalspublic boolean equals(Object)ないpublic boolean equals(T)ため、コンパイラは比較が常にfalseを返すことを確認する方法がありません。実際、別のクラスのオブジェクトと同等のオブジェクトを作成できるため、falseが返されない場合もあります。

をオーバーライドすることはできません。したがって、同じクラスにできないオブジェクトは互いに同一==にすることはできないため、コンパイラは比較が重要でないことを認識します(両方がnullでない限り、別の方法でチェックする必要があります)。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.21.3によると:

キャスト変換(§5.5)によって一方のオペランドの型を他方の型に変換できない場合は、コンパイル時エラーになります。2つのオペランドの実行時の値は、必然的に等しくなりません。

于 2012-12-02T13:09:39.317 に答える
1

私はあなたがこのようなものが欲しいと思います:

    public static boolean compare(Object o1, Object o2)

そして、おそらく次のようinstanceofに比較するために使用しますif(o1 instanceof Teacher && o2 instanceof Student)

getClass()を返すため例外がスローされClass<? extends Object>、エラーメッセージが示すように、これらのクラスは比較できないため、 Student と Teacher は異なるクラスを返します (文字列のようなものが返されると仮定するのは間違いだと思います)。

于 2012-12-02T13:07:21.440 に答える