private List<? extends Object> mTestList; public <T extends Object> void notifyDataSetChanged(int position, T object) { mTestList.set(position,object); }
您的每一个用心回答,都会让这个世界变得更美好一些!
其实我猜到你想做什么,就是rv更新某个位置的数据。
只需要提供位置,然后根据list的位置更新对应数据,再刷新adapter。
通常你上面的代码写在adapter的基类比较多,也就是通过适配器的实现类,限定某个数据类型。比如MyAdapter<User>,必须限定好,你的list,自然就是list<T>了,你上面的代码就可以正常的set了。
<? extends E> 是 Upper Bound(上限) 的通配符,用来限制元素的类型的上限
比如List<? extends Fruit> fruits;
那么集合中的元素类型上限就是Fruit,所以我们赋值只能是Fruit或者它的子类,如下:
fruits = new ArrayList<Fruit>(); fruits = new ArrayList<Apple>();
当你的类型是Fruit的父类时,比如Object,就会编译报错
fruits = new ArrayList<Object>();
通过上面的内容,我们一般会认为插入数据使用Fruit或者它的子类就理所当然的正确了,但并不是这样。
因为我们只是指定了它的上限是Fruit,但具体是什么类型我们是不知道的,你可以是Apple、Banana或者其他的类型,为了安全,编译器会报错,防止类型不兼容的情况出现,除了null,因为它可以表示任何类型。
其实我猜到你想做什么,就是rv更新某个位置的数据。
只需要提供位置,然后根据list的位置更新对应数据,再刷新adapter。
通常你上面的代码写在adapter的基类比较多,也就是通过适配器的实现类,限定某个数据类型。比如MyAdapter<User>,必须限定好,你的list,自然就是list<T>了,你上面的代码就可以正常的set了。
<? extends E> 是 Upper Bound(上限) 的通配符,用来限制元素的类型的上限
比如List<? extends Fruit> fruits;
那么集合中的元素类型上限就是Fruit,所以我们赋值只能是Fruit或者它的子类,如下:
当你的类型是Fruit的父类时,比如Object,就会编译报错
通过上面的内容,我们一般会认为插入数据使用Fruit或者它的子类就理所当然的正确了,但并不是这样。
因为我们只是指定了它的上限是Fruit,但具体是什么类型我们是不知道的,你可以是Apple、Banana或者其他的类型,为了安全,编译器会报错,防止类型不兼容的情况出现,除了null,因为它可以表示任何类型。