2

プリミティブ型リテラルまたは型変数を式で使用できますinstanceofか?

class MyClass<T> {
    {
         boolean b1 = null instanceof T; // T erasure -> Object should be used
         boolean b2 = 2 instanceof Integer; // Incompatible operands
    }

コンパイル エラーが発生します。これらのエラーを回避し、式でプリミティブ型リテラル/型変数を使用する方法はありますinstanceofか?

基本的に、そんなことは絶対にできないと安心したいのです。

4

4 に答える 4

5

いいえ、タイプeraser のためです。のインスタンスはMyClass<T>、実際には何が何であるかを知りませんT

のインスタンスが必要ですClass<T>。その後、メソッドを使用できますisInstance。これを行う 1 つの方法は、コンストラクターで指定することです。

class MyClass<T>
{
    private Class<T> clazz;

    MyClass(Class<T> clazz)
    {
        this.clazz = clazz;
    }

    // Now you can use clazz to check for instances, create new instances ect.
}

2 番目の場合、問題は 2 番目ではなく 1 番目のオペランドにあります。プリミティブ値自体はInteger;のインスタンスではありません。ボックス版は次のとおりです。

Object obj = 2;
boolean b2 = obj instanceof Integer;

本物のプリミティブ値を取得するときはいつでも、型をすでに知っているため、動的型チェックを行うことはあまり意味がありません。

于 2011-01-31T18:29:35.063 に答える
2
  1. 型消去のため、何が何であるかを知ることはできませんT

  2. リテラル (文字列リテラルを除く) はオブジェクトではありません。
    したがって、いいえ。

于 2011-01-31T18:30:07.670 に答える
1

基本的に、instanceof は左オペランドとしてオブジェクトを要求します。プリミティブ変数はオブジェクトではないため、そのように使用することはできません。

于 2011-01-31T18:30:21.033 に答える
0
  1. あなたはそれをすることはできません。
  2. 使えたとしても使えません。

の典型的な使用法はinstanceof次のようになります

void somemethod(Collection c) {
    if (c instanceof List) {...}
}

somemethod(new ArrayList());

ここで重要なことは、サブタイプ (ここではリスト) のインスタンスである場合とそうでない場合があるスーパータイプ (ここではコレクション) のオブジェクトを取得することです。プリミティブでは、これは不可能です。

void anothermethod(double x) {
    .... // <------ X
}

anothermethod(42);

ポイント X には double 型の変数 x があり、int 42 に関する隠し情報はありません。実際のパラメーター 42 は double として偽装されず、double に変換されています。そのため、 instanceof はプリミティブには意味がありません。

于 2011-01-31T19:31:53.897 に答える