为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿波罗的战车 2021-07-02 14:00:01
请帮助,我收到以下消息,在我拥有的以下代码中:listaFinal = (ArrayList<PuntoNota>) getIntent().getSerializableExtra("miLista");AdapterDatos adapter = new AdapterDatos(this, listaFinal);PuntoNota.javapublic 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;}}适配器数据: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"); 是否建议删除或隐藏此消息?
查看完整描述

2 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

根本原因:这是来自 IDE 的警告,getSerializableExtra返回 a 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");



查看完整回答
反对 回复 2021-07-14
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您可以设置警告抑制@SuppressWarnings注释。

例子:

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

这是一个注释,用于抑制有关未经检查的通用操作(不是异常)的编译警告,例如强制转换。它本质上意味着程序员不希望收到有关他在编译特定代码位时已经知道的这些信息的通知。

您可以在此处阅读有关此特定注释的更多信息:

禁止警告

此外,Oracle 在此处提供了一些有关注释使用的教程文档:

注释

正如他们所说,

“在与泛型出现之前编写的遗留代码交互时,可能会出现‘未经检查’警告(在题为泛型的课程中讨论)。”


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 284 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信