Java Generics:即使已经使用instanceof进行了检查,也可以在通用List中取消选中

时间:2016-07-06 09:51:11

标签: java android generics

所以我有一个获取ArrayList(Parameter)的方法,它应该返回相同类型的ArrayList:

   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;
        }

对于这个实现,我得到一个&#34;未经检查的投射警告&#34;。当然我可以使用&#34; SuppressWarnings&#34;但我正在寻找一个更好的解决方案,或者这个解决方案是&#34; SuppressedWarnings&#34;已经被认为是一个干净的解决方案?

感谢您的一切,是的,我已经搜索了Stackoverflow的答案。但我真的不知道这是否仍然是hacky或干净...

2 个答案:

答案 0 :(得分:3)

一般来说,仅仅因为data.get(0)String并不意味着所有其他元素都是,所以编译器无法知道它的安全

(实际上,即使经过instanceof检查,它仍然是一个不安全的演员。)

在这种情况下,由于您对JSON库的了解,将@SuppressWarnings添加到specificData的声明是合理的。

答案 1 :(得分:2)

你不需要重复使用data,事实上它的设计很差,有这样的副作用。该方法返回一个列表;它不应该改变其中一个参数。

只需创建列表并使用data填充

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

您可以保持其余代码相同。您现在不会有任何警告(或副作用!)。