2016-07-06 26 views
1

所以我有獲取一個ArrayList(參數)的方法和它應該返回的ArrayList相同類型:Java泛型:未經檢查的泛型列表鑄即使已經與的instanceof檢查

static ArrayList<?> readFromFileToArrayList (Activity activity, String name, ArrayList<?> data) { 

    try { 
     String savedData = FileReadWrite.readFromFile(activity, name); 

     JSONArray jsonArray = new JSONArray(savedData); 
     if(data.get(0) instanceof String){ 
      ArrayList<String> specificData= (ArrayList<String>) data; 
      for(int i = 0; i<jsonArray.length();i++){ 
       if(!data.contains(jsonArray.optString(i))){ 
        specificData.add(jsonArray.optString(i)); 
       } 
      } 
      return specificData; 
     } 

對於此實現我得到一個「未經檢查的投射警告」。當然,我可以使用「SuppressWarnings」,但我正在尋找一個更好的解決方案,或者是「SuppressedWarnings」這個解決方案已經被認爲是一個乾淨的解決方案嗎?

謝謝你的一切,是的,我已經搜索Stackoverflow的答案。但我真的不知道這是否仍然hacky或乾淨...

回答

2

你不需要重複使用data,事實上這是糟糕的設計有這樣的副作用。該方法返回一個列表;它不應該改變它的一個參數。

只需創建一個新的名單data填充它:

ArrayList<String> specificData = new ArrayList<>(); 
for (Object obj : data) 
    specificData.add(obj.toString()); 

你可以把你的代碼相同的其餘部分。您現在不會有任何警告(或副作用!)。

+0

因爲我真的不知道那麼多關於Java 8,我有一些後續問題: 1.這隻可能,如果我有數據像字符串,int ..在Arraylist,而不是自建的Datatpyes列表的權利? 2.不知何故「data.stream()」在Android studio上不起作用。 (已包含「import java.util.stream。*;」和配置的gradle)是否有我缺少的東西? 感謝您的回覆。 PS由於我沒有足夠的聲望,無法投票您的答案。請upvote我的問題,以便我可以upvote你的;) – Ayox

+1

@Ayox你沒有標記你的問題[標籤:機器人](我爲你添加了它)。 Android不支持Java 8.我修改了我的答案,使用與Android兼容的Java 7。 – Bohemian

+0

非常感謝你的一切:) 據我所知,他們使用Android N. [鏈接](https://developer.android.com/preview/j8-jack.html) – Ayox

3

一般來說,只是因爲data.get(0)String並不意味着所有其他元素都是,所以編譯器無法知道它是安全的。

(實際上,即使在instanceof檢查後,它仍然總是不安全的劇組)。

在這種情況下,由於您對JSON庫的瞭解,因此在specificData的聲明中添加@SuppressWarnings是合理的。

+0

感謝您的回答。 PS由於我沒有足夠的聲望,因此無法投票。請加快我的問題,以便我可以upvote你;) – Ayox