泛型

泛型:把类型作为变量的值

	泛型也可以自定义使用,也有四步骤:
	1.泛型的定义:定义在类、定义在方法、定义在成员变量
	2.泛型的设置:成员变量、方法参数……
	3.泛型的确定:当调用定义的代码时
	4.泛型的触发:当调用设置的代码时
package SE03.n2泛型;

import java.util.ArrayList;

public class Demo02Generic {
	public static void main(String[] args) {
/*
 * 泛型
 */
		ArrayList<String> a =new ArrayList();//将ArrayList的泛型定义为String类型
//		a.add(1);//泛型规定为String类型,则不能添加除String类型外的其他数据类型的值
		a.add("小明");//String
		a.add("小王");
		a.add("小陈");
		for (String object : a) {//迭代
			String s=(String)object;//对a内容强转
			System.out.println(s+"abc");
		}

		Person<Bird<Fly>,Pay> b=new Person<Bird<Fly>,Pay>();
		b.play(new Bird<Fly>());
//		b.play(new Dog());//报错,不符合泛型的规定
//		b.show(new Bird<Fly>(),new Bird<Fly>(),new Dog());
		Bird<Fly> bird=new Bird<Fly>();
		bird.add(new Fly());
//		?:确定泛型时的通配符,不能在new对象的时候使用,只能在方法参数时使用
		Customer c=new Customer();
		Person<Dog,Money> person = new Person<Dog, Money>();
		person.setPet(new Dog());
//		c.callPlayPet(person);
		
//		?的extends和super问题
		Person<Bird, Money> p1=new Person<Bird, Money>();
		p1.setPet(new Canary());//p1设置了宠物为Canary是Bird的子类
		c.callPlayPet(p1);//call到的p1泛型为Bird和Money,那就只能花Money玩鸟
		Person<Bird, Money> p2=new Person<Bird, Money>();
		p2.setPet(new Bird());//p1设置了宠物为Bird,toString为“小鸟”
		c.callPlayPet2(p2);
	}
}

自定义泛型

Person类

package SE03.n2泛型;

public class Person<Pet,Pay> implements Act<Stand>{//泛型可以定义在类
	public void play(Pet pet) {//和传String比较,范围更大,松耦合
		System.out.println("和"+pet+"玩");
	}
	public <T> void show(T t) {//泛型可以定义在成员方法
		System.out.println(t);
	}
	public <T,T2,T3> void show(T t,T2 t2,T3 t3) {//泛型可以定义在成员方法
		System.out.println(t);
		System.out.println(t2);
		System.out.println(t3);
	}
//	public void show2(T t) {//T报错
		//定义在某方法上的泛型,只能设置在某方法
//	}
	@Override
	public void add(Stand t) {//重写Act接口中的抽象方法
		// TODO 自动生成的方法存根
		
	}
	Pet pet;
	public Pet getPet() {
		return pet;
	}
	public void setPet(Pet pet) {
		this.pet = pet;
	}
	public void playPet(Pay pay) {
		System.out.println("表演玩"+this.pet);
		System.out.println("得到报酬"+pay);
	}
	
	

}

Pay类

package SE03.n2泛型;

public class Pay {
	
}

Dog类

package SE03.n2泛型;

public class Dog {

	@Override
	public String toString() {
		return "小狗";
	}

}

Bird类

package SE03.n2泛型;
public class Bird<T> implements Act<T>{

	@Override
	public String toString() {
		return "小鸟";
	}
	@Override
	public void add(T t) {
		// TODO 自动生成的方法存根
	}

}

Act接口

package SE03.n2泛型;

public interface Act <T>{//接口也可以泛型
	public abstract void add(T t);
}

Stand(Act接口的实现类泛化类型)

package SE03.n2泛型;

public class Stand {
	
}

Fly类(鸟的Act)

package SE03.n2泛型;

public class Fly {
	public Fly() {
		System.out.println("飞");
	}
}

Canary(继承Bird,可细化至种类)

package SE03.n2泛型;

public class Canary extends Bird{
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "金丝雀";
	}
}

Customer类

package SE03.n2泛型;

public class Customer {
	Money money=new Money();
	public void callPlayPet(Person<?extends Bird,Money> p) {//Bird的子类
		p.playPet(money);//调用Person类中的playPet方法
		//playPet(Pay pay)Pay是泛型,实参可以是任何财务,money
	}
	public void callPlayPet2(Person<?super Canary,Money> p) {//Canary的父类
		p.playPet(money);
	}
}

Money类

package SE03.n2泛型;

public class Money {
	@Override
	public String toString() {
		// TODO 自动生成的方法存根
		return "很多钱";
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值