2016-07-06 67 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