2017-08-17 5 views
0

次のonFilter()メソッドは私に配列リストを与えていますが、私は異なるモデルの異なる配列を持っています。例えば :ArrayList、ArrayListなどです。Modelを取得する方法AndroidのArrayListのデータ型ですか?

@Override 
public void onFilter(ArrayList items) { 
    if (items != null && items.size() > 0) { 
     if (items.get(0) instanceof ChatModel) { 
      // Do something 
     } else if (items.get(0) instanceof ContactDetailModel) { 
      // Do something 
     } 
    } 

ここでは、Arrayオブジェクトのタイプを簡単に確認できますが、配列が空の場合、arraylistモデルタイプを確認するにはどうすればよいですか?オブジェクトを取得することなくarraylistモデルタイプ全体をチェックできますか?

答えて

1

配列が空の場合、配列型の型をチェックするにはどうすればよいですか?

単純に、ArrayListに余分な型情報がないため、できません。唯一Object秒です。

オブジェクトを取得することなく、全体のモデルを確認できますか?

ArrayListはタイプObjectの要素しか保持しない。したがって、最初の要素をチェックしても、配列全体がその型であるとは限りません。 コンパイル時にチェック(ArrayList <>)がありますが、実行時にすべての要素を反復処理して、instanceofでチェックして、それらが必要な型であることを確認する必要があります。

1

Java Reflectionを使用してこれを実現できます。

例があります:あなたのケースでは

public class Test { 

    List<String> stringList = new ArrayList<String>(); 
    List<Integer> integerList = new ArrayList<Integer>(); 

    public static void main(String... args) throws Exception { 
     Field stringListField = Test.class.getDeclaredField("stringList"); 
     ParameterizedType stringListType = (ParameterizedType) stringListField.getGenericType(); 
     Class<?> stringListClass = (Class<?>) stringListType.getActualTypeArguments()[0]; 
     System.out.println(stringListClass); // class java.lang.String. 

     Field integerListField = Test.class.getDeclaredField("integerList"); 
     ParameterizedType integerListType = (ParameterizedType) integerListField.getGenericType(); 
     Class<?> integerListClass = (Class<?>) integerListType.getActualTypeArguments()[0]; 
     System.out.println(integerListClass); // class java.lang.Integer. 
    } 
} 

あなたの関数のパラメータの型を取得する必要があります。この場合、Reflectionは、同じ方法でユーザーであることができ、あなたのパラメータで、使用して:

public void onFilter(ArrayList items) { 

    // using 
    items.getClass().getGenericSuperclass(); 

    // or 
    ((ParameterizedType) items 
     .getClass() 
     .getGenericSuperclass()).getActualTypeArguments()[0]); 
} 

このところで、あなたのArrayListは、任意のアイテムを持っている必要はありません。

の場合、はランタイムで相対ジェネリック型を取得することはできません。ジェネリックのコンパイル時にデータ型が消去されるためです。

Link to related awnser

+0

理由はわかりませんでした。 @OrkhanAlikhanovあなたのコメントを開発してください。 – GuilhermeFGL

+0

あなたは完全に正しいわけではありません。私の元々の解決策は 'ヒープ'リストの変数の例です。しかし、非常によく似た方法で 'Stack'リストの変数でリフレクションを使うことができます。私はその解決策で私の答えを更新する – GuilhermeFGL

+0

あなたはそれを働かせることができますか? https://repl.it/KO5D/3 –

関連する問題