2

配列内のクラスのすべてのインスタンスを検索する必要があるプログラムがあります。これを行うメソッドを作成したいと思います。たとえば、私が配列を持っている場合

Object[] arr = {"mystring", new Boolean(false), new Integer(4), new Character('i')}

そして、Stringの引数を使用してこのメ​​ソッドを呼び出しました(実際には、引数のタイプがどうあるべきかわかりません)。このメソッドは、の配列を返し{"mystring"}ます。

私は次のようなことを試しました

public void printInstancesOf(Class c, Object[] array)
{
    for (Object obj : array)
    {
        if (obj instanceof c)
        {
             System.out.println(obj);
        }
    }
}

しかし、それはコンパイルすらしません。誰かがこれを行う方法を知っていますか?それともできませんか?

4

4 に答える 4

6

Class.isInstance(Object o)が必要なようです:

指定されたオブジェクトが、このクラスによって表されるオブジェクトと割り当て互換であるかどうかを判別します。このメソッドは、Java言語のinstanceof演算子と動的に同等です。指定されたObject引数がnull以外であり、ClassCastExceptionを発生させることなく、このClassオブジェクトによって表される参照型にキャストできる場合、メソッドはtrueを返します。それ以外の場合はfalseを返します。

if (c.isInstance(obj) {
    System.out.println(obj);
}
于 2012-06-20T03:27:53.013 に答える
2

がリテラルクラスobjであるかどうかをテストしているため、これは機能しません。私はJava環境を手元に持っていませんが、次のようなものを信じていますinstanceofc

if (obj.getClass().equals(c)) {

トリックを行う必要があります。これはおそらくサブクラスでは機能しませんが、ここでは問題にはならないはずです。

編集:他の人が指摘しているように

if (c.isInstance(obj)) {

より良い選択です

より大きな質問は...なぜあなたはこれをしているのですか?Javaで緩い型付けをシミュレートしようとすることは素晴らしい目標ですが、通常は非常に悪い考えです。代わりに、適切なポリモーフィズムおよび/またはジェネリックを使用してください(カスタムクラスを使用)。

于 2012-06-20T03:26:14.283 に答える
1

慣用的なJavaのようには見えません。通常、特定のクラスの配列のみを作成し、String、Boolean、Integer、Characterなどの異なるクラスを混在させることはありません。

これは通常、コードの臭いです。

次のような階層がある場合

AFoo、BFoo、CFoo-> Fooを拡張し、それらを配列に含めると、メッセージに大幅に反応するようになります。

for (Foo foo : foos) 
    foo.react (param); 

その後、AFoosはBFoosとは別の方法で反応する可能性があります。それ以外の場合はinstanceofを使用します。

for (Foo foo : foos) 
    if (foo instanceof BFoo)
        barDoSomethingWith (foo, param);  
于 2012-06-20T11:50:56.347 に答える
0

やってみました:

private <E> List<E> findInstances(Class<E> type, Object[] arr) {
    List<E> instances = new ArrayList<E>();
    for(Object o : arr) {
        if(type.isInstance(o)) {
            instances.add((E)o);
        }
    }
    return instances;
}
于 2012-06-20T03:31:13.907 に答える