2016-11-26 7 views
0

文字列、int、またはブール値の型を保存するには、値と呼ばれるクラスワイルドカードクラスがあるとします。Javaワイルドカード参照

public class Value<Type>{ 
    Type _value; 

    public Value(Type value) { 
     _value = value; 
    } 

    public Type getValue() { 
     return _value; 
    } 

} 

私はこのような配列で、このクラスからインスタンスの束を保存します。この後

private ArrayList<Value<?>> _myValues = new ArrayList<Value<?>>(); 

を、私は私が保存されている値で何かを作るつもりです。では、ArrayListの各Valueインスタンスがint、String、またはbooleanであるかどうかをチェックし、それを変数に代入するにはどうすればよいですか?次のようなものがあります:

//If it is it 
int myNumber = someValueInstance.getValue(); 

これも同様ですか?

ありがとうございます。

+0

あなたがうまくいくかどうかを見て、あなたがこれらの価値観で何をしたいのかを教えてください。もっと良い方法があるかもしれません。ローカル変数への代入はそれ自体の最終目標ではありません。 – weston

+0

@weston私は、int、Stringまたはbooleanだけを返す関数/演算を認識するよりも、非常に簡単なインタープリタを作っています。 –

+0

何に戻しますか? int/StringまたはBoolを取得したら、次に何をするのですか? – weston

答えて

0

プリミティブ変数を使用してArrayListの内容を保存する代わりに、Wrapperオブジェクトを使用します。 ArrayListから特定の値を取得し、それをラッパーオブジェクトに入れることができます。

しかし、値のArrayListの型を知らなくても、変数を格納する前に値を決定することはできないと思います。なぜなら、格納する前に格納する内容を知る必要があるからです。お役に立てれば! :)

1

Value<?>Value<Object>と本質的に同等であるので、getValueの戻り型はObjectあろう。 instanceofを使用して、値がInteger,String、またはBooleanであるかどうかを確認できます。

Object val = someValueInstance.getValue(); 
if (val instaceof Integer) { 
    int number = (Integer)val; 
    //... 
} else if (val instaceof String) { 
    String string = (String)val; 
    //... 
} else if (val instaceof Boolean) { 
    boolean bool = (Boolean)val; 
    //... 
} 
0

現実的に言えば、これを行うための唯一の方法は、instanceof小切手の束であるが、これは私の心に、ジェネリック医薬品の目的に反し。

あなたは暗黙のうちに意味Value<?>の完全なリストを、持っている、私はこれらのValueのオブジェクトに含まれているどのタイプか分からないが、私はそれらのリストをしたいです。あなたがタイプに作用することがinstanceofif文の(とてもたくさん必要以上に複雑ですので、あなたのラッパーに含まれるタイプについてケアが、ない場合は、ワイルドカードの形式がより便利である - このことを覚えていますジェネリックはバインドされていません)です。

タイプがわかっている場合は、にはコレクションがあります。あなたが行動しなければならない数のコレクションを作成します。これにより、適切なリストに挿入する作業が必要になりますが、ラッパーに含まれている値を処理するのがより簡単で、より簡単で従来的な処理になります。

List<Type<String>> stringWrappers = new ArrayList<>(); 
List<Type<Integer>> integerWrappers = new ArrayList<>(); 
List<Type<Boolean>> booleanWrappers = new ArrayList<>();