Java向上造型很多人都不陌生,但封装为集合后再向上造型,还能行么?
先说结论,可以。
案例:
首先是父类
public class Person {
private String name;
private int age;
private boolean flag = false;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Person{");
sb.append("name='").append(name).append('\'');
sb.append(", age=").append(age);
sb.append(", flag=").append(flag);
sb.append('}');
return sb.toString();
}
}
然后是基类
public class Man extends Person{
private String manKind;
public Man() {
}
public String getManKind() {
return manKind;
}
public void setManKind(String manKind) {
this.manKind = manKind;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Man{");
sb.append("name='").append(getName()).append('\'');
sb.append(", age=").append(getAge());
sb.append(", flag=").append(isFlag());
sb.append(", manKind='").append(manKind);
sb.append('}');
return sb.toString();
}
}
业务场景:
两个接口传递过来的集合,一个是Man类型,一个是Person类型,希望能将集合中部分元素的flag属性修改为true
笨办法是写两个函数,分开使用
但这里我试了一下,是可以直接使用一个函数简单的完成这业务的
public static void main(String[] args) {
ArrayList<Man> manList = new ArrayList<>();
for (int i = 0; i <3 ; i++) {
Man man = new Man();
man.setName("name"+i);
man.setAge(11+i);
man.setManKind("kind"+i*2);
manList.add(man);
}
System.out.println(manList);
Map map = new HashMap<String,Object>();
map.put("manList",manList);
// 类型转换
ArrayList<Person> personArrayList = (ArrayList<Person>) map.get("manList");
for (int i = 0; i < personArrayList.size(); i++) {
Person person = personArrayList.get(i);
person.setAge(person.getAge()+1);
person.setFlag(true);
System.out.println(person);
}
System.out.println(manList);
}
测试结果:
[Man{name='name0', age=11, flag=false, manKind='kind0}, Man{name='name1', age=12, flag=false, manKind='kind2}, Man{name='name2', age=13, flag=false, manKind='kind4}]
Man{name='name0', age=12, flag=true, manKind='kind0}
Man{name='name1', age=13, flag=true, manKind='kind2}
Man{name='name2', age=14, flag=true, manKind='kind4}
[Man{name='name0', age=12, flag=true, manKind='kind0}, Man{name='name1', age=13, flag=true, manKind='kind2}, Man{name='name2', age=14, flag=true, manKind='kind4}]
总结来说,即使是子类集合,也可以强转为父类集合后做属性修改,这样原始的集合元素就能完成属性修改