4

OK、これは私のクラスです。オブジェクトをカプセル化し、equals と to String をこのオブジェクトにデリゲートします。なぜ、インスタンスを使用できないのですか???

public class Leaf<L>
{
    private L object;

    /**
     * @return the object
     */
    public L getObject() {
        return object;
    }

    /**
     * @param object the object to set
     */
    public void setObject(L object) {
        this.object = object;
    }

    public boolean equals(Object other)
    {
        if(other instanceof Leaf<L>) //--->ERROR ON THIS LINE
        {
            Leaf<L> o = (Leaf<L>) other;
            return this.getObject().equals(o.getObject());
        }
        return false;
    }

    public String toString()
    {
        return object.toString();
    }
}

どうすればこれを機能させることができますか?? ありがとう!

4

3 に答える 3

10

型消去のためinstanceof、再定義可能な型でのみ使用できます。(直感的な説明はinstanceof、実行時に評価されるものですが、型パラメーターはコンパイル中に削除 (「消去」) されます。)

Generics FAQ の良いエントリは次のとおりです。

于 2010-12-09T11:27:39.657 に答える
2

私は同様の問題を抱えており、次のようなリフレクションを使用して解決しました:

public class Leaf<L>
{
    private L object;

    /**
     * @return the object
     */
    public L getObject() {
        return object;
    }

    /**
     * @param object the object to set
     */
    public void setObject(L object) {
        this.object = object;
    }

    public boolean equals(Object other)
    {
        if(other instanceof Leaf) //--->Any type of leaf
        {
            Leaf o = (Leaf) other;
            L t1 = this.getObject();   // Assume it not null 
            Object t2 = o.getObject(); // We still not sure about the type
            return t1.getClass().isInstance(t2) && 
               t1.equals((Leaf<L>)t2); // We get here only if t2 is same type
        }
        return false;
    }

    public String toString()
    {
        return object.toString();
    }
}
于 2013-05-26T18:26:25.510 に答える
2

一般的な情報は実際にはコンパイル時に削除され、実行時には存在しません。これは型消去として知られています。内部では、すべての Leaf オブジェクトが実際には Leaf<Object> と同等になり、必要に応じて追加のキャストが追加されます。

このため、ランタイムは Leaf<Foo> と Leaf<Bar> の違いを判別できないため、instanceof テストは実行できません。

于 2010-12-09T11:53:27.013 に答える