JAVA学习:泛型的必要性

    没有泛型的情况下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型的好处是在编译的时候检查类型安全,并且所有的强制类型转换都是自动和隐式的。提高代码的重用率。

  综述:在使用ArrayList等集合时若不使用泛型,则可能导致程序的安全性受到威胁。如下例所示,定义猫类和狗类,分别创建一个实例,并将其放入ArrayList中,当从ArrayList中取出的动物类型与指定类型不同时,则会有异常抛出。

实例代码:

import java.util.ArrayList;

public class fanxing {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArrayList al = new ArrayList();
		// 创建一只狗
		Dog dog1 = new Dog();
		Cat cat1 = new Cat();
		// 放入到集合中
		al.add(dog1);
		al.add(cat1);
		// 取出
		// 无泛型会隐藏安全隐患(al.get(1)实际取出的是猫)
		Dog temp = (Dog) al.get(1);
	}

}

class Dog {
	private String name;
	private int 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;
	}
}

class Cat {
	private String color;
	private int age;

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

抛出类型不匹配异常:

引入泛型之后便不会出现上述问题:

import java.util.ArrayList;

public class fanxing {
	public static void main(String[] args) {
		// 引入泛型
		ArrayList<Dog> aDog = new ArrayList<Dog>();
		ArrayList<Cat> aCat = new ArrayList<Cat>();
		// 创建一只狗
		Dog dog1 = new Dog();
		Cat cat1 = new Cat();
		// 放入到集合中
		aDog.add(dog1);
		aCat.add(cat1);
		// 取出
		// 取出符合规定类型的动物,不再存在安全隐患
		Dog temp = (Dog) aDog.get(0);
	}

}

class Dog {
	private String name;
	private int 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;
	}
}

class Cat {
	private String color;
	private int age;

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值