需求:分配的一个任务关于搜索的修改,用户点击搜索的时候实际上请求了N个接口,不同接口返回的bean是不同的,实际的展示效果用的是recyclerView,那么就需要我们封装一个统一bean。
我们知道通过创建一个集合,集合里面存储不同的数据bean,然后拿出来强转回去这样的方式是不行的,因为java是假的泛型,编译时候会进行泛型擦除,变成Object,编译器通过预先留下的注解来描述说明对应的泛型,但是没有办法给你说明无数种,比如一个Father,一个Son,它没有办法给你记住超过一个类型的泛型。
我们平时的写法java:List<?> list = new ArrayList<?>();
其实就是变向说明了编译器只能给你记住一种类型
一开始我想的是通过创建一个bean包含所有的其他bean的数据类,但是我看了之前同事写的代码之后发现了另外一种更好的方式。
之前想的是
class AllBean{
public Bean1 bean1;
public Bean2 bean2;
public Bean3 bean3;
public Bean4 bean4;
}
然后再用一个集合把它存储起来:List
项目里用的是:List<AllBean<?>>
class AllBean<T>{
public int type;
public int priority;
public T result;
}
这个T可以是数组,可以是String ,后面再强转回来就可以了。
相当于数组里面存储的都是AllBean,AllBean里面存储了各种类型的T,这样就成功把各种泛型都存储到一个数组里面了。
详细:
calss People<T>{
public int type;
public int priority;
public T result;
}
class Father{
public String name;
}
class Son{
public String name;
}
List<People<?>> list = new ArrayList<People<?>>();
list.add(new People(new Father(1,"father")));
list.add(new People(new Son(2,"son")));
下面代码是成立的
(Father)list.get(0).result;
(Son)list.get(0).result;