1

エラーを次の行に切り分けました: string.getClass() == jojo.getClass() この行は 2 つの Class オブジェクトを作成し、それらが (2 つの参照のように) 同じオブジェクトを指しているかどうかをチェックするべきではありませんか? false の値を返すのではなく、コードは実行されません。

public class Tester 
{
    public static void main(String[] args) 
    {
        OreoJar jojo = new OreoJar(0);
        OreoJar momo = new OreoJar(1);
        String string = "Hello";

        if (momo.getClass() == jojo.getClass())
        {
            System.out.println("Momo and jojo are of the same class");
        }

        if (string.getClass() == jojo.getClass())
        {
            System.out.println("String and jojo are of the same class");
        }
    }
}

public class OreoJar 
{
    int oreos;

    public OreoJar(int oreos)
    {
        this.oreos = oreos;
    }

    public void count()
    {
        System.out.println(oreos + " oreos in this jar!");
    }
}

このコメントは隠されているようなもので、初心者(私のような)にとって最も意味があるので、言及する価値があると思います

-JLSによると、「キャスト変換によっていずれかのオペランドの型をもう一方の型に変換できない場合はコンパイル時エラーです」したがって、型AとBの2つの参照を比較できるのは、 A を B にキャストできるか、B を A にキャストできる場合 – パトリシア シャナハン

4

3 に答える 3

6

OPがコンパイルエラーを引用することに同意します。

とにかく、誰かが実際にコンパイルを行うと、コンパイルエラーは非常に明白です。

エラーは次のとおりです。

Tester.java:15: incomparable types: java.lang.Class<capture#125 of ? extends java.lang.String> and java.lang.Class<capture#29 of ? extends OreoJar>
    if (string.getClass() == jojo.getClass()){
                          ^

理由は明白なようです。

Object.getClass() の Javadoc から:

The java.lang.Class object that represents the runtime class of the
object. The result is of type Class<? extends X> where X is the
erasure of the static type of the expression on which getClass is
called.

つまり、String インスタンスは への参照を返しClass<? extends String>、OreoJar インスタンスは への参照を返します。Class<? extends OreoJar>

String を拡張する型が OreoJar を拡張する型になる可能性がないことをコンパイラが認識しているため、2 つの型には互換性がありません。そのため、比較するとコンパイル エラーが発生します。


少し話題から外れていますが、言及する価値があると思います、あなたは言いました:

この行は 2 つの Class オブジェクトを作成し、それらが同じオブジェクトを指しているかどうかを確認するべきではありませんか?

理解を深めた方が良いと思います。2 つの Classオブジェクトを「作成」するつもりはありません。getClass() はClass オブジェクトへの参照を返します。そして、それは常にobject を指すことができる参照であり、 objectを指すobjectではありません(それも奇妙に聞こえます)

于 2013-01-07T02:00:44.613 に答える
3

コンパイルされない理由は、クラスに汎用コンポーネントがあるためだと思います。またmomo.getClass().equals(jojo.getClass()) 、クラスの正規名を比較して、同様の効果を得ることもできます。momo.getClass().getCanonicalName().equals(jojo.getClass().getCanonicalName())

于 2013-01-07T01:50:50.440 に答える
-1

getClass()クラスのインスタンスを返します。getClass().getName()文字列を返します。メソッドは、String.equals(otherString)文字列が等しいかどうかを比較する正しい方法です。

于 2013-01-07T01:42:11.433 に答える