今天在项目中遇到了个问题,就是List<E> list = new ArrayList<E>();的list中存放不同的变量然后取出list中某一个对象后进行强制转换成放进去的类,
开始很迷糊,项目中的问题是,app首页推荐了音乐,视频,商品,活动等4种对象,
接口中的结构是:
那么,问题来了,我需要把这些数据展示到主页的ListView中,那么就需要把这些不同的实体类放到同一个ListView中
思考了很久,由于本人java基础不算好,没有好的实现思路,求助于大神,说是用instanceof关键字。
百度了下,才明白,java还有这种机制,是我太渣渣了~~~~~
instanceof介绍:http://baike.baidu.com/view/1989052.htm?fr=aladdin (这里我就不赘述了,百度百科说的很详细)
下面说说我的实现方法:
1、首先去定义一个Bean类,此Bean类存放了我上面说提到的每个类型的标识
public class BeanInfo {
private String open_status;
public String getOpen_status() {
return open_status;
}
public void setOpen_status(String open_status) {
this.open_status = open_status;
}
}
2、定义A类和B类继承自BeanInfo类
public class A extends BeanInfo implements Serializable {
private String aid;
public String getAid() {
return aid;
}
public void setAid(String aid) {
this.aid = aid;
}
}
public class B extends BeanInfo implements Serializable {
private String bid;
public String getBid() {
return bid;
}
public void setiId(String bid) {
this.bid = bid;
}
}
现在问题来了,我父类中定义的open_status属性是private,平常我们理解的不是说,java的子类不能继承父类的私有(private修饰的)方法和属性吗?
开始我也是这么以为,定义成了public修饰的,结果在用的时候可以直接赋值,感觉不爽啊,就试了下用private修饰,结果也好使,原因是:
父类的私有属性和私有方法,子类是不能直接访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。不过我上面的Bean类有公用方法可以使我去访问私有方法。
3、测试结果如何~~~~
public class TestInstanceof {
/**
* @param args
*/
public static void main(String[] args) {
List<BeanInfo> list = new ArrayList<BeanInfo>();
A a = new A();
a.setOpen_status("a");
a.setAid("aid");
list.add(a);
B b = new B();
b.setOpen_status("b");
b.setiId("bid");
list.add(b);
for (int i = 0; i < list.size(); i++) {
if (list.get(i) instanceof A) {
A aa = (A) list.get(i);
System.out.println("A类 --> open_status = "
+ aa.getOpen_status());
System.out.println("A类 --> aid = " + aa.getAid());
} else if (list.get(i) instanceof B) {
B bb = (B) list.get(i);
System.out.println("B类 --> open_status = "
+ bb.getOpen_status());
System.out.println("B类 --> bid = " + bb.getBid());
} else {
System.out.println("都不是啊");
}
}
}
}
输出结果:
A类 --> open_status = a
A类 --> aid = aid
B类 --> open_status = b
B类 --> bid = bid
这样依赖,又get了一项新技能~~~
然后,通过判断具体是哪个实体类的对象然后list.get(postition)然后强制转换成目标类然后通过intent携带到下个activity中然后设置到界面上或者做一些操作~
好了,就说到这里了,希望大家多多光顾我的博客,帮小弟耍耍访问量哈~~~~