Android List<? extends Object> list如何set新的对象?

img


private List<? extends Object> mTestList;
public <T extends Object> void notifyDataSetChanged(int position, T object) {
      mTestList.set(position, object);
}

如图。

1) 直接给你代码,代码里有详细的注释,copy后即可运行


import java.util.ArrayList;
import java.util.List;
/**
 * @author pcj
 * @date 2022/4/19
 * @note
 */
public class T3 {

    //private List<? extends Object> mTestList;
    //在泛型里,?是不确定的类型,所以这里修改为Object
    private List<Object> mTestList;
    public <T extends Object> void notifyDataSetChanged(int position, T object) {
        //做个判断,避免jvm没有初始化
        if (mTestList == null) mTestList = new ArrayList<Object>();
        mTestList.set(position, object);
    }

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        T3 t3 = new T3();
        // 做个判断,可能会有不初始化的情况
        if (t3.mTestList == null) {
            List<Object> temp_mTestList = new ArrayList<Object>();
            t3.mTestList = temp_mTestList;
        }
        // 添加测试数据
        t3.mTestList.add(new Integer(1));
        t3.mTestList.add(new Integer(2));
        System.out.println("修改前:" + t3.mTestList.toString());
        //执行修改
        t3.notifyDataSetChanged(1, 3);
        System.out.println("修改后:" + t3.mTestList.toString());

    }
}

你是想问如果向list中添加对象么?
1、正常顺序添加就是用list.add(xxx);
2、指定位置插入list.add(index,xxx),该位置之后的数据会向后平移;
3、指定位置替换list.set(index,xxx),这个会替换指定索引位的数据,其他不变,不过这个替换是必须原位置有值的情况下才行哦,要不然报错;
所以看你想做什么了,要用对应的方法

还有你不理解这个T是怎么来的?这个T是泛型,一般是在你实例化类的时候指定的,在调用方法的时候泛型已经确定了例如:

import java.util.ArrayList;
import java.util.List;


public class Demo<T extends Object> {

    private List<T> mTestList;

    public void notifyDataSetChanged(int position, T object) {
        if (mTestList == null) {
            mTestList = new ArrayList<T>(16);
        }
        mTestList.add(position, object);

    }

    public static void main(String[] args) {
        Demo<A> demo = new Demo<A>();
        demo.notifyDataSetChanged(0,new A());
    }
}

class A extends Object{

}

正在使用通用通配符,无法执行添加操作,只能添加null

代码如下,望采纳

private List<T> mTestList;
    public void notifyDataSetChanged(int position, T object) {
        mTestList.set(position,object);
    }

要么把泛型定义在类上,要么把list定义成

List<Object>

,不要用?

{}】;【?】是通配符,泛指所有类型,一般用于定义一个引用变量,这样可以指向多个对象。 https://www.php.cn/java/guide/441664.html
通配符<? extends T>和<? super T>区别及使用场景_pbxs的博客-CSDN博客 <? extends T> : 上界通配符(Upper Bounds Wildcards) <? super T> : 下界通配符(Lower Bounds Wildcards)平时开发会遇到不少<? extends T>和<? super T>通配符的使用,比如:Collections类提供的集合元素拷贝的copy()方法就同时使用了<? extends T>和<? super T>。public class Coll.. https://blog.csdn.net/WLQ0621/article/details/108453438#:~:text=%E6%89%80%E4%BB%A5%EF%BC%8C%3C%3F%20extends%20T%3E,%E4%B8%8A%E7%95%8C%E9%80%9A%E9%85%8D%E7%AC%A6%EF%BC%8C%E8%A2%AB%E8%AE%BE%E8%AE%A1%E4%B8%BA%E7%94%A8%E6%9D%A5%E8%AF%BB%E5%8F%96%E6%95%B0%E6%8D%AE%E7%9A%84%E6%B3%9B%E5%9E%8B%EF%BC%88%E5%8F%AA%E8%83%BD%E8%AF%BB%E5%8F%96%E6%95%B0%E6%8D%AE%E4%B8%BAT%E7%9A%84%E5%85%83%E7%B4%A0%EF%BC%89%EF%BC%9B%3C%3F%20super%20T%3E%20%E4%B8%8B%E7%95%8C%E9%80%9A%E9%85%8D%E7%AC%A6%EF%BC%8C%E8%A2%AB%E8%AE%BE%E8%AE%A1%E4%B8%BA%E7%94%A8%E6%9D%A5%E5%86%99%E6%95%B0%E6%8D%AE%E7%9A%84%E6%B3%9B%E5%9E%8B%EF%BC%88%E5%8F%AA%E8%83%BD%E5%86%99%E5%85%A5T%E6%88%96T%E7%9A%84%E5%AD%90%E7%B1%BB%E5%9E%8B%EF%BC%89%E3%80%82