Java中的泛型

泛型的分类:

   泛型类、泛型方法、泛型接口

泛型只在编译时 起作用,通过反编译工具反编译.class文件得到的java代码中没有泛型。

泛型类:

public class MyGen<T> {
//T只是一个占位符,占了一个数据类型的位置,这个数据类型什么时候确定,在创建这个类的对象时明确
}
class TestMyGen{
        public static void main(String[] args) {
                 //创建自定义的泛型类的对象  ,明确了T所代表的类型是String
                MyGen<String> my1=new MyGen<String>(); 
                MyGen<Integer> my2=new MyGen<Integer>(); //T所代表的数据类型是Integer
                MyGen<Dog> my3=new MyGen<Dog>();//T所代表的数据类型就是Dog
        }
}
class Dog{
        
}

 

泛型方法:

public class Test2 {
        public static void main(String[] args) {
                MyGen2<String> my1=new MyGen2<String>();
                my1.add("hello");
                my1.show("hello");//Q代表String类型
                my1.show(123);//Q代表Integer类型
                
                my1.fun(123,45,6,7,865); //5个参数
                my1.fun("hello","world");//2个参数
                my1.fun(new Dog());//1个参数, 
                
        }
}
class MyGen2<T>{//泛型类,T在创建类的对象时明确
        
        public <T>void add(T t){  //泛型方法,T在创建类的对象时确
                System.out.println(t);
        }
        
        public <Q> void show(Q q){//Q代表一种数据类型,在调用方法时确定
                
        }
        public <P> void fun(P... p){//可变参数的泛型方法  ,解决参数类型不同,个数不同的方法重载问题
                for (P p2 : p) {
                        System.out.println(p2);
                }
        }
        
}


泛型接口:

 

public class Test3 {
        public static void main(String[] args) {
                MyInt<String> my=new MyInt<String>();//T的类型才明确,String类型
                MyInt2 my2=new MyInt2();
        }
}
interface MyInterface<T>{//泛型接口  (1)T的数据类型可以在实现类时明确,(2)在创建实现类的对象时明确
        
}
class MyInt<T> implements MyInterface<T>{ //实现类也不知道数据,(2)在创建实现类的对象时明确
        
}
class MyInt2 implements MyInterface<String>{//(1)T的数据类型可以在实现类时明确
        
}

 

泛型的高级应用:

 (1)泛型的上限   :确定父类    ,本身和子类可以使用   <? extends 父类类型>  举例
public static void print(ArrayList<? extends Person> al){

        }

 (2)泛型的下限  :确定子类   ,本身和父类可以使用  <? super 子类的类型>
public static void show(ArrayList<? super Student> al){

 }

 

泛型的应用:

public enum Gender {
	男,女
}
public class Person {
	private String name;
	private int age;
	private Gender sex;
	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 Gender getSex() {
		return sex;
	}
	public void setSex(Gender sex) {
		this.sex = sex;
	}
	public Person(String name, int age, Gender sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public Person() {
		super();
	}
	@Override
	public String toString() {
		return "[name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
	
	
}
public class Student extends Person {
	private String stuNo;//学号

	public String getStuNo() {
		return stuNo;
	}

	public void setStuNo(String stuNo) {
		this.stuNo = stuNo;
	}

	public Student(String name, int age, Gender sex, String stuNo) {
		super(name, age, sex);
		this.stuNo = stuNo;
	}

	public Student() {
		super();
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString()+"学号="+stuNo;
	}
	
}
public class Teacher extends Person {
	private int teachOfYear;

	public int getTeachOfYear() {
		return teachOfYear;
	}

	public void setTeachOfYear(int teachOfYear) {
		this.teachOfYear = teachOfYear;
	}

	public Teacher(String name, int age, Gender sex, int teachOfYear) {
		super(name, age, sex);
		this.teachOfYear = teachOfYear;
	}

	public Teacher() {
		super();
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString()+"教龄="+teachOfYear;
	}
}

测试类:

import java.util.ArrayList;
import java.util.Date;

public class Test {
	public static void main(String[] args) {
		ArrayList<Person> alPer=new ArrayList<Person>();
		//(1)创建Person类型的对象
		Person p1=new Person("marry1", 20, Gender.女);
		Person p2=new Person("marry2", 21, Gender.女);
		Person p3=new Person("marry3", 22, Gender.女);
		//将Person类型的对象存储集合中
		alPer.add(p1);
		alPer.add(p2);
		alPer.add(p3);
		
		
		/***调用遍历的方法*/
		print(alPer);
		
		ArrayList<Student> alStu=new ArrayList<Student>();
		//(2)创建Student类型的对象
		alStu.add(new Student("jack1", 20, Gender.男, "sxt1001"));
		alStu.add(new Student("jack2", 21, Gender.男, "sxt1002"));
		
		/***调用遍历的方法*/
		print(alStu);
		
		ArrayList<Teacher> alTea=new ArrayList<Teacher>();
		//(3)创建Teacher的对象
		alTea.add(new Teacher("Rose1", 80, Gender.女, 60));
		alTea.add(new Teacher("Rose2", 81, Gender.女, 61));
		alTea.add(new Teacher("Rose3", 82, Gender.女, 62));
		alTea.add(new Teacher("Rose4", 83, Gender.女, 63));
		
		/***调用遍历的方法*/
		print(alTea);
		
		System.out.println("\n----------------谁能使用show方法-------------------");
		show(alStu);  //Student
		//show(alTea);报错
		show(alPer);//Person是Stduent的父类
		
		ArrayList<Object> alObj=new ArrayList<Object>();
		alObj.add(new Date());
		show(alObj);//Object是Student的间接父类
		
	}
	/**只要是Person及Person的子类都可以使用这个方法  --泛型的上限,确定了父类Person*/
	public static void print(ArrayList<? extends Person> al){
		for (Person per : al) {
			System.out.println(per);
		}
		System.out.println("\n--------------------------------------");
	}
	
	/**泛型的下限,确定了子类Student, Stduent及Student的父类(直接/间接)*/
	public static void show(ArrayList<? super Student> al){
		for (Object obj : al) {
			System.out.println(obj);
		}
		System.out.println("\n--------------------------------------");
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二百四十九先森

你的打赏是我努力的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值