26

次のクラスがあるとしましょう:

public class Test<E> {
    public boolean sameClassAs(Object o) {
        // TODO help!
    }
}

oと同じクラスであることを確認するにはどうすればよいEですか?

Test<String> test = new Test<String>();
test.sameClassAs("a string"); // returns true;
test.sameClassAs(4); // returns false;

(Object o)スーパークラスをオーバーライドしているため、メソッドのシグネチャを変更できないため、メソッドのシグネチャを選択できません。

また、キャストを試みて、失敗した場合に結果の例外をキャッチするという道をたどりたくありません。

4

4 に答える 4

27

のインスタンスには、実行時の状態Testに関する情報はありません。そのため、Test のコンストラクターにEa を渡す必要があります。Class<E>

public class Test<E> {
    private final Class<E> clazz;
    public Test(Class<E> clazz) {
        if (clazz == null) {
            throw new NullPointerException();
        }
        this.clazz = clazz;
    }
    // To make things easier on clients:
    public static <T> Test<T> create(Class<T> clazz) {
        return new Test<T>(clazz);
    }
    public boolean sameClassAs(Object o) {
        return o != null && o.getClass() == clazz;
    }
}

「instanceof」関係が必要な場合は、比較Class.isAssignableFromの代わりに使用します。同じ理由でオブジェクトが必要なため、非ジェネリック型である必要があることにClass注意してください。ETestClass

Java API の例については、java.util.Collections.checkedSetおよび類似のものを参照してください。

于 2008-09-09T11:16:30.907 に答える
10

私がいつも使っている方法は以下です。それは苦痛で少し醜いですが、私はより良いものを見つけていません. ジェネリックがコンパイルされるとクラス情報が失われるため、構築時にクラス型を渡す必要があります。

public class Test<E> {
    private Class<E> clazz;
    public Test(Class<E> clazz) {
       this.clazz = clazz;
    }
    public boolean sameClassAs(Object o) {
        return this.clazz.isInstance(o);
    }
}
于 2008-09-09T11:09:35.650 に答える
2

私はそれを次のようにしか機能させることができませんでした:

public class Test<E> {  

    private E e;  

    public void setE(E e) {  
        this.e = e;  
    }

    public boolean sameClassAs(Object o) {  

        return (o.getClass().equals(e.getClass()));  
    }

    public boolean sameClassAs2(Object o) {  
        return e.getClass().isInstance(o);  
    }
}
于 2008-09-09T11:03:43.683 に答える