2011-01-31 17 views
2

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

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

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

基本的に、私はそれを絶対に安心したいと思います。私は決してそれをすることができません。

答えて

5

いいえ、タイプ消去の場合です。 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. 
} 

秒1の場合、問題は最初のオペランドではなく、秒です。プリミティブ値自体はIntegerのインスタンスではありません。パッケージ版は、次のとおりです。

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

あなたは本物のプリミティブな値を持っているときはいつでも、あなたはまだ動的な型チェックはあまり意味がありません作るタイプを知っていますよ。

2
  1. タイプ消去のため、Tがわからないことがあります。

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

1

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

0
  1. あなたはできません。
  2. 可能であれば、使用することはできません。ここで(またはサブタイプのインスタンスであってもなくてもよい:

instanceofの典型的な使用法は、ここで重要なことは、あなたが(コレクションこちら)スーパータイプのオブジェクトを取得することである

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

somemethod(new ArrayList()); 

のように見えます:リスト)。プリミティブでは、これは不可能です:double型の変数xがあります点xで

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

anothermethod(42); 

、いくつかのint型42の実パラメータ42についての隠された情報は、二重マスカレードませんでしたありません、を変換持っていますダブルに。そのため、instanceofはプリミティブに意味をなさないのです。

関連する問題