泛型的向上及向下转型

1、先写父类

package com.wyq.Arr;

public class Person {
	private String name;
	private Gender gender;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Gender getGender() {
		return gender;
	}
	public void setGender(Gender gender) {
		this.gender = gender;
	}
	public Person(String name, Gender gender) {
		super();
		this.name = name;
		this.gender = gender;
	}
	public Person() {
		super();
	}
	
	
}
enum Gender{
	男,女
}

2、再写子类1

package com.wyq.Arr;

public class Teacher extends Person{
	private int teachAge;

	public int getTeachAge() {
		return teachAge;
	}

	public void setTeachAge(int teachAge) {
		this.teachAge = teachAge;
	}

	public Teacher(String name, Gender gender, int teachAge) {
		super(name, gender);
		this.teachAge = teachAge;
	}
	
}

3、子类2

package com.wyq.Arr;

public class Student extends Person{
	private int sutuNo;

	public int getSutuNo() {
		return sutuNo;
	}

	public void setSutuNo(int sutuNo) {
		this.sutuNo = sutuNo;
	}

	public Student(String name, Gender gender, int sutuNo) {
		super(name, gender);
		this.sutuNo = sutuNo;
	}

	public Student() {
		super();
	}
}

4、书写测试类

package com.wyq.Arr;

import java.util.ArrayList;
import java.util.Collection;



public class Test {
	public static void main(String[] args) {
		//使用泛型,在创建对象的时候就明确了对象的类型为person类
		ArrayList<Person> al = new ArrayList<Person>();
		//创建三个Person对象
		Person p1 = new Person("张三", Gender.女);
		Person p2 = new Person("李四", Gender.女);
		Person p3 = new Person("王五", Gender.男);
		//將person類型添加到集合中
		al.add(p1);
		System.out.println(al.add(p2));
		al.add(p3);
		//遍歷輸出
		System.out.println(al);
		//掉用方法进行遍历
		//这种是创建对象的方式
		Test t = new Test();
		t.show(al);
		//这种是不用创建对象的方式
		Test.show(al);		
		
		/*创建学生类的信息
		 * 
		 * 
		 * */
		//确定类型
		ArrayList<Student> alStu = new ArrayList<Student>();
		//创建对象,初始化属性
		Student stu1 = new Student("张三", Gender.男, 101);
		Student stu2 = new Student("李四", Gender.男, 102);
		Student stu3 = new Student("王五", Gender.女, 103);
		Student stu4 = new Student("马六", Gender.男, 104);
		//添加元素
		alStu.add(stu1);
		System.out.println(alStu.add(stu2));
		alStu.add(0, stu4);
		alStu.add(stu3);
		System.out.println(alStu);
		t.fun(alStu);
		System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
		fun(alStu);
		System.out.println("+++++++++++++++++++++++++++++++++++++++");
		
		gett(al);
		gett(alStu);
		
		Collection<Object> coll = new ArrayList<Object>();
		Collection<Teacher> colt = new ArrayList<Teacher>();
//		gett(coll);
//		gett(colt);
		//這裡的連個都報錯了,進一步說明只能是直接傅雷或者直接子類進行調用,其他的都不行
		
		
	}
	//寫了一個方法,用於遍歷集合中元素
	public static void show(ArrayList<Person> al){
		for (Person per:al){
			System.out.println(per.getName()+"\t"+per.getGender());
		}
	}
	//再写一个方法,用户循环遍历集合中的元素
	public static void fun(ArrayList<? extends Person> al){
		//这种方式表示属性的类型,只能是该类及其直接子类进行调动
		for ( Person p:al){
			System.out.println(p);
		}
	}
	public static void gett(ArrayList<? super Student> al){
		//這裡的這種方法只能是student類及其父類進行調用
		for(Object o:al){
			System.out.println(o);
		}
	}
	
}

猜你喜欢

转载自blog.csdn.net/wyqwilliam/article/details/93341352