2017-08-17 88 views
0

繼onFilter()方法給了我一個數組列表,但我有不同的arraylist與不同的模型, 例如:ArrayList,ArrayList等。如何在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 
     } 
    } 

在這裏,我可以很容易地檢查數組對象的類型,但我怎麼能檢查的ArrayList模型的類型,如果數組是空的?我們是否可以檢查整個陣列列表模型類型而無需獲取其對象?

回答

1

如何檢查數組爲空的數組列表模型類型?

簡而言之,您不能在ArrayList中找到任何額外的類型信息。它只是Object s。

我們可以檢查整個陣列列表模型類型而無需獲取其對象嗎?

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

你並不完全正確。我最初的解決方案是'Heap'列表中的變量示例。但是您可以使用非常類似的方式在'Stack'列表中的變量中使用反射。我用該解決方案更新我的答案 – GuilhermeFGL

+0

你可以讓它工作,我不能。 https://repl.it/KO5D/3 –

相關問題