0

私はジェネリック型のクラスを持っています:

class Foo<T> {
    protected boolean validateType(Object obj){
        if (obj instanceof T) {
            return true;
        }
        return false;
    }

}

テストする:

Foo foo = new Foo<String>();
foo.validateType(new String()); // should return true
foo.validateType(new Long()); // should return false;

ジェネリック型 'T' に対してオブジェクトを検証する必要がある関数があります。明らかに上記のコードにエラーがありますか?

どうすればそんなことができますか

4

2 に答える 2

2

あなたがやろうとしていることは現状では不可能です - ジェネリックは Java でerasureによって実装されています。つまり、ジェネリック パラメータは実行時に存在しません。Foo<String>コンパイラが型チェックするためにありますが、実行時に aと aの違いを見分ける方法はありませんFoo<Long>

したがって、特定のトークンをチェックする場合は、自分で行う必要があります。この種のチェックを行う一般的なパターンは、Classオブジェクトを使用することであり、これらはコンパイラによって型チェックできるという利点があります。

class Foo<T> {
    private final Class<T> genericClass;

    public Foo(Class<T> clazz) {
        this.genericClass = clazz;
    }

    protected boolean validateType(Object obj){
        return genericClass.isInstance(obj);
    }
}

呼び出し元は、Classオブジェクト自体を渡す必要があることに注意してください。この要件を回避する方法はありません。Java 自体によって自動的に配線することはできません。

if (x) return true; else return false;(また、まったく同じであるreturn x;が、より紛らわしく、エラーが発生しやすい場合に使用するのは悪い考えです。)

于 2012-06-29T09:28:36.997 に答える
1

そのため、Instance ofには、実行時 Fooの内容に関する情報がありません。したがって、 のコンストラクターにを渡す必要があります。T

Class<T>Foo

private final Class<T> cl;

protected boolean validateType(Object ob){
    return cl.isInstance(ob);
}
...
于 2012-06-29T09:30:27.027 に答える