Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有列表的警告<;字符串>;安卓上_Java_Android_String_List_Warnings - Fatal编程技术网

Java 带有列表的警告<;字符串>;安卓上

Java 带有列表的警告<;字符串>;安卓上,java,android,string,list,warnings,Java,Android,String,List,Warnings,我想解决这个警告。在代码的这一部分,我有一个警告:Type safety:Unchecked cast from Object to List String preferences=pPrefs.getString(SharedPreferences); ObjectMapper mapper=新的ObjectMapper(); byte[]byteTemp=mapper.readValue(首选项,byte[].class); ByteArrayInputStream in=新的ByteArr

我想解决这个警告。在代码的这一部分,我有一个警告:
Type safety:Unchecked cast from Object to List

String preferences=pPrefs.getString(SharedPreferences);
ObjectMapper mapper=新的ObjectMapper();
byte[]byteTemp=mapper.readValue(首选项,byte[].class);
ByteArrayInputStream in=新的ByteArrayInputStream(byteTemp);
ObjectInputStream is=新的ObjectInputStream(in);
列表编号=(列表)为.readObject();

我该怎么办?谢谢大家。

ObjectInputStream::readObject返回一个
对象


您正在将其强制转换为
列表
,而没有首先检查它是否真的是
列表
。就编译器所知,它可以是任何类型的
对象
(一个
字符串
,一个
整数
,等等……)

解决这个问题的一种可能方法是验证它是一个列表,然后检查所有元素以确定它们是否是字符串

Object objs = is.readObject();

if (objs instanceof List) {
   List<Object> listObj = (List<Object>)objs;

   boolean result = true;
   for (Object o : listObj) {
       result &= o instanceof String;
   }

   if (result) return (List<String>)listObj;

}
Object objs=is.readObject();
if(objs实例列表){
List listObj=(List)objs;
布尔结果=真;
for(对象o:listObj){
结果&=o字符串的实例;
}
如果(结果)返回(列表)listObj;
}

不能保证这是一个好主意。

如果您认为
对象是
列表
,则无法将其强制转换为
列表
,而不生成警告,因为在运行时,只能判断对象是否是
列表
。但是,您可以编写一个方法,返回一个
列表
,它是
对象
的副本。像这样的东西会有用的。如果无法复制,则返回
null

static List<String> copy(Object object) {
    if (!(object instanceof List)) {
        return null;
    }
    List<?> list = (List) object;
    List<String> temp = new ArrayList<String>();
    for (Object ob : list) {
        if (ob instanceof String) {
            temp.add((String) ob);
        } else if (ob == null) {
            temp.add(null);
        } else {
            return null;
        }
    }
    return temp;
}
静态列表副本(对象){
if(!(列表的对象实例)){
返回null;
}
List=(List)对象;
List temp=new ArrayList();
用于(对象对象对象:列表){
if(ob instanceof String){
临时添加((字符串)ob);
}else if(ob==null){
临时添加(空);
}否则{
返回null;
}
}
返回温度;
}

对象
是顶级类。您正试图强制转换一个
对象
,该对象可以是任何类型的对象。您也没有提供太多的信息,所以我假设这是您的问题。我使用jackson库(json处理器)来保存对象并将其加载到文件中。我试图加载的对象是一个列表,因此我没有取消启动此错误。发布您的方法代码。您说您使用的是jackson,但这只是使用一个普通的旧Java
ObjectInputStream
。我不写所有普通的内容,只写一小部分。无论您是否首先检查(这不是一个坏主意),编译器仍将对强制转换发出警告。唯一真正的替代方法是抑制警告。是的,没错。我刚才解释了为什么会出现这个警告。这将取决于编译器。在您的情况下,我会首先检查返回的
对象是否是
列表的一个instance
。用户drakej的方法是实现这一点的好方法。然后,如果警告仍然存在,我将抑制它。
static List<String> copy(Object object) {
    if (!(object instanceof List)) {
        return null;
    }
    List<?> list = (List) object;
    List<String> temp = new ArrayList<String>();
    for (Object ob : list) {
        if (ob instanceof String) {
            temp.add((String) ob);
        } else if (ob == null) {
            temp.add(null);
        } else {
            return null;
        }
    }
    return temp;
}