当前位置: 首页 > 面试题库 >

未经检查的将java.io.Serializable强制转换为java.util.ArrayList

蒯卓君
2023-03-14
问题内容

请帮忙,我在以下代码中收到以下消息:

listaFinal = (ArrayList<PuntoNota>) getIntent().getSerializableExtra("miLista");

AdapterDatos adapter = new AdapterDatos(this, listaFinal);

PuntoNota.java

public class PuntoNota implements Serializable{
private String punto;
private String nota;

public PuntoNota (String punto, String nota){
    this.punto = punto;
    this.nota = nota;
}

public String getPunto(){
    return punto;
}


public String getNota(){
    return nota;
}

}

AdapterDatos:

public AdapterDatos(Context context, ArrayList<PuntoNota> puntoNotaList) {
    this.context = context;
    this.puntoNotaList = puntoNotaList;
}

该应用程序运行良好,但是我收到以下消息:

未经检查的强制转换:从’java.io.Serializable’到’java.util.ArrayList’更少…(Ctrl + F1)。
关于此代码:(ArrayList)getIntent()。getSerializableExtra(“ myList”); 建议删除或隐藏此消息吗?


问题答案:

根本原因:
这是来自IDE的警告,getSerializableExtra返回Serializable,并且您尝试转换为ArrayList<PuntoNota>。如果程序无法将其强制转换为期望的类型,则可能在运行时引发
ClassCastException

解决方案: 在android中传递用户定义的对象时,您的类应实现Parcelable而不是Serializable接口。

class PuntoNota implements Parcelable {
    private String punto;
    private String nota;

    public PuntoNota(String punto, String nota) {
        this.punto = punto;
        this.nota = nota;
    }

    protected PuntoNota(Parcel in) {
        punto = in.readString();
        nota = in.readString();
    }

    public String getPunto() {
        return punto;
    }

    public String getNota() {
        return nota;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(punto);
        dest.writeString(nota);
    }

    public static final Creator<PuntoNota> CREATOR = new Creator<PuntoNota>() {
        @Override
        public PuntoNota createFromParcel(Parcel in) {
            return new PuntoNota(in);
        }

        @Override
        public PuntoNota[] newArray(int size) {
            return new PuntoNota[size];
        }
    };
}

在发送方

ArrayList<PuntoNota> myList = new ArrayList<>();
// Fill data to myList here
...
Intent intent = new Intent();
intent.putParcelableArrayListExtra("miLista", myList);

在接收方

ArrayList<? extends PuntoNota> listaFinal = getIntent().getParcelableArrayListExtra("miLista");


 类似资料:
  • 我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?

  • 问题内容: 在我的spring应用程序上下文文件中,我有类似以下内容: 在java类中,实现如下所示: 在Eclipse中,我看到一条警告: 类型安全性:未经检查的从Object到HashMap的转换 我做错了什么?我该如何解决该问题? 问题答案: 好吧,首先,你正在通过新的HashMap创建调用浪费内存。你的第二行完全忽略了对此创建的哈希图的引用,从而使该哈希图可用于垃圾收集器。因此,不要这样做

  • 问题内容: 我有以下代码行 哪里 但我收到有关未经检查的转化的警告。如何停止此警告? 问题答案: 之所以会这样,是因为getSpecialCharMap()返回的对象的类型不能由编译器验证为HashMap 。继续并提供getSpecialCharMap的原型。

  • 问题内容: 我当前正在使用条件来检索用户的详细信息,但是当尝试用合适的用户查询详细信息对象时,我得到了ClassCastException。 我的标准代码; 我也尝试使用; 两者都给我ClassCastException。我知道我可以通过让用户实现Serializable来轻松解决它,但是还有其他解决方案吗? 问题答案: 唯一的其他解决方案是实现Externalizable。

  • 奇怪的情况-下面是代码: 构建项目时(在项目属性中使用编译器选项Xlint:unchecked),我得到一个警告: 警告:[未选中]未选中的强制转换 ArrayList list=(ArrayList)obj[1]; 必需:ArrayList 找到:对象 但用同样的方法来浇铸字符串是可以的。这里有什么问题?

  • 问题内容: 我有一个名为的接口,该接口具有一个功能 许多其他类都使用此方法。由于此函数始终返回a ,因此将导致未经检查的强制转换。例: 我的问题与乔什·布洛赫(Josh Bloch)的建议有关(《有效的Java》,第二版,第24项): 每次使用@SuppressWarnings(“ unchecked”)批注时,都添加一条注释,说明这样做安全的原因。 他的例子是 (请参阅第9/117页的底部:ht