Javaジェネリック医薬品:比較するとクラスのオブジェクトo <E>

StackOverflow https://stackoverflow.com/questions/51582

  •  09-06-2019
  •  | 
  •  

質問

ということかして以下のクラス:

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) 私overriddingスーパークラスならいいなと思っ選ぶように方法はあります。

それだけでなく、道路の試みるとともにキャストし引くこの結果、例外の場合で失敗します。

役に立ちましたか?

解決

のインスタンス Test な情報をどのような E で行います。い渡す必要がある 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 と比較しました。注意 E 必要なものをすることにより汎用の種類、同じ理由 Test ニーズに Class オブジェクトです。

例えば、Java APIを参照 java.util.Collections.checkedSet することになります。

他のヒント

方法は私はいつも使っています。で痛みを少し見を言ったりします。きのクラスタイプを構築している場合(ジェネリック医薬品を作るにはクラスの情報は失われます。

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);
    }
}

いくらいしか作ることができないので働くようになります:

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);  
    }
}

どうしてそうなっちゃうんですかいに同じことをやっかいだけで実現できることでお楽しみいただきキャストの場合はキャストに失敗しない場合は、ClassCastExceptionがスローされます。本イベントは終了いたしました。ッると、やりたいこと。

なおsameClassAs方法ようになっているでしょう:

public boolean sameClassAs(Object o) {
    boolean same = false;
    try {
        E t = (E)o;
        same = true;
    } catch (ClassCastException e) {
        // same is false, nothing else to do
    } finally {
        return same;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top