0
点赞
收藏
分享

微信扫一扫

【三言两语】一些泛型小知识

ZGtheGreat 2022-02-20 阅读 81
java

一个问题引出泛型:

如果一个大类 如篮子类里装物品鸡蛋和面包,数组类型如何定义可以满足存放不同类型的物品?可以用所以类型父类Object来定义。但有弊端,输出时不能全部转换为一个类输出

源码如下:

public static void main(String[] args ) {
		Egg egg[] =new Egg[2];
		egg[0]=new Egg();
		egg[1]=new Egg();
		Basket basket = new Basket(3);
		
		for(int i=0;i<egg.length;i++)
			basket.add(egg[i]);
		basket.add(new Bread());//①混入Bread对象,编译通过,因为数组类型为Object
		for(int i=0;i<basket.length();i++) {
			Egg g=(Egg)basket.indexOf(i);
			
			System.out.println(g);//②运行时出错,当i=2时,对象实际是Bread
												//不能强制转换为Egg;
		}
	}
}
class Basket{
	int n; //篮子能放入的物品总数
	int total; //物品的实际个数
	private Object arr[]; //利用数组放物品
	
	public Basket(int n) {
		this.n=n;
		total=0;
		arr=new Object[n];
	}

	public void add(Object obj) {  //将一个对象加到数组
		arr[total++]=obj;
	}
	
	public Object indexOf(int i) { //获取数组第i个元素的对象
		return arr[i];
	}
	
	public int length() { //获得对象数组的长度
		return total;
	}
}
class Egg{
	double weight;
	public String toString(){
		return ("我是鸡蛋");
	}
}
class Bread{
	double weight;

	@Override
	public String toString() {
		return "Bread [weight="+"我是面包"+"]";
	}
}

运行结果如下:

 

 编译通过,但运行出错。

这时,泛型就要出场了。利用泛型可以定义类的实际类型实现多类型存入。

略微增加泛型改动如下:(测试类中,不同类型会报错了)

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Egg1 egg[] =new Egg1[2];
		egg[0]=new Egg1();
		egg[1]=new Egg1();
		Basket1<Egg1> basket = new Basket1<>(3);
		
		for(int i=0;i<egg.length;i++)
			basket.add(egg[i]);
		//basket.add(new Bread1());//编译不通过,因为不是Egg类型
		for(int i=0;i<basket.length();i++) {
			Egg1 g=basket.indexOf(i);
			
			System.out.println(g);
		}
	}

}
class Basket1<T>{
	int n; //篮子能放入的物品总数
	int total; //物品的实际个数
	private Object arr[]; //利用数组放物品
	
	public Basket1(int n) {
		this.n=n;
		total=0;
		arr=new Object[n];
	}

	public void add(T obj) {  //将一个对象加到数组
		arr[total++]=obj;
	}

	public T indexOf(int i) { //获取数组第i个元素的对象
		return (T) arr[i];
	}
	
	public int length() { //获得对象数组的长度
		return total;
	}
}
class Egg1{
	double weight;
	public String toString(){
		return ("我是鸡蛋");
	}
}
class Bread1{
	double weight;

	@Override
	public String toString() {
		return "Bread [weight="+"我是面包"+"]";
	}
}

什么是泛型?

泛型,也称之为“参数化类型”,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型类的定义

 关于定义的模板与常用参数意义:

泛型类的使用规则:

泛型的类型参数只能是类类型,而不能是简单类型为;

泛型的类型参数可以有多个;

静态字段的类型不能是类型参数;

不能直接创建类型参数变量的数组,只能通过反射创建;

泛型的参数类型可以使用extends和super关键词;

泛型的参数类型还可以是通配符类型。

看完上述内容还是无法做到,不同类型输出...咋办呢?

 这时可以利用咱的【泛型方法】来输出;

泛型方法

泛型方法实例:

@SafeVarargs  //T(类型参数名)
	static <T> void print(T...ts) {          //泛型方法,形参是可变参数 ,ts(参数名)实质上是一个数组
		for (int i=0;i<ts.length;i++)
			System.out.print(ts[i]+" ");
		System.out.println();
	}
	public static void main(String[] args) {
		
		print("北京市","长江","泰山");  //类型一样
		print("这个手机","价格","2000.00","元");  //四个参数,类型不一样
		String fruit[]= {"apple","banana","orange","peach","pear"};  //String 数组对象
		print(fruit);
	}

运行结果:

 细心的你可能已经知道,如何输出了吧!

将上述篮子类中的add()方法改为泛型方法:

	public <T>void add(T...arr) {         //【用泛型方法实现输出】

		for (int i=0;i<arr.length;i++)
			      System.out.println(arr[i]);           //将一个对象加到数组
		
	}

就可以完成所有类的输出啦!

如果对你有所帮助,记得点赞收藏噢!

举报

相关推荐

0 条评论