Java从入门到精通 第十七章 泛型

前面提到面向对象中存在多态这一特性,在向上造型的时候不会出现类型转换的错误,但是由于向下造型的时候 却可能出现类型转换的错误,毕竟不是所有的父类类型实例都是子类类型实例.所以为了避免程序员在创建更通用的方法时 将Object作为参数传入方法时取出来的时候出现问题,特别弄了个泛型。泛型本质上就是创建泛型类的时候 传入了什么类型 取出来的时候就是什么类型,如果与传入的类型不一致就会出现编译错误的问题。下面看下例子。

package core.genercis;


public class Test {

	private Object object;

	public Object getObject() {
		return object;
	}

	public void setObject(Object object) {
		this.object = object;
	}

	public static void main(String[] args) {
		Test test = new Test();
		test.setObject(new Integer(2));
		Integer integer = (Integer) test.getObject();// 正确的向下造型
		Float float1 = (Float) test.getObject();// 错误的向下造型 在编译的时候
												// 编译器发现不了问题,只有在运行的时候才会发现问题的所在

	}
}

上面这个Test类很好的说明了 如果不使用泛型类的话,在存入类型的时候没有问题,但是在取出来的时候因为是Object对象实例,虽然我们知道是Integer封装类实例,但是Float类型也可以取出来,编译器不会报错,向下造型 正确错误是检查不出来的,除非使用instanceof方法检查,但是那就太麻烦了,所以出现了泛型类.下面看下 泛型类 是如何解决这一问题的。

package core.genercis;

public class OverClass<T> {
	private T t;

	public T getT() {
		return t;
	}

	public void setT(T t) {
		this.t = t;
	}

	public static void main(String[] args) {
		// 创建类的时候 将泛型类传进去.这样在用的时候就可以取出指定类型,防止出现取出来向下造型的时候出现问题
		OverClass<Integer> class1 = new OverClass<>();
		class1.setT(new Integer(2));
		Integer integer = class1.getT();
		// Float float1=class1.getT();//这时 取出成员变量的时候就必须与泛型类 的类型一致 或者其子类

	}

}

OverClass这个类 就是通过 在set传入数据类型的时候 指定了数据类型,所以取出来的时候就是传入的类型,这样也就省去了向下造型 类型转换错误的问题.

泛型的常规用法

  1. 定义泛型类的时候 传入多个类型
  2. 定义泛型类是声明数组类型
  3. 集合类中声明容器的元素
    重点来看一下集合中声明容器的元素
package core.genercis;

import java.util.HashMap;
import java.util.Map;

public class MutiOverClass<K, V> {
	Map<K, V> map=new HashMap<>();
	private K k;
	private V V;
	public K getK() {
		return k;
	}
	public void setK(K k) {
		this.k = k;
	}
	public V getV() {
		return V;
	}
	public void setV(V v) {
		V = v;
	}
	
	public void put(K k,V v) {
		map.put(k, v);
	}
	
	private V get(K k) {
		return  map.get(k);
	}
	public static void main(String[] args) {
		MutiOverClass<String,Object>  mutiOverClass=new MutiOverClass<>();
		mutiOverClass.put("1", "张三");
		mutiOverClass.put("2", "李四");
		System.out.println(mutiOverClass.get("1"));

	}
}

需要注意的使用集合类中容器的元素 已经用上了泛型,List/Set/Map/Vector(这个用的比较少 可随机访问 类似ArrayList集合)

泛型的高级用法

  1. 限制泛型类类型
  2. 使用泛型通配符
package core.genercis;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ListGenercis<T extends List> {
    public static void main(String[] args) {
    	ListGenercis<LinkedList> listGenercis=new ListGenercis<>();  
    	ListGenercis<ArrayList> listGenercis2=new ListGenercis<>(); 
    	
    	ListGenercis<? extends List> regexlist=null;//限制泛型类型+使用泛型通配符
    	regexlist=new ListGenercis<LinkedList>();
	}
}

从实际撸代码中可以看到 限制泛型类类型 一般用于泛型类的创建过程中,如果想要泛型类可以传入某个类或者其子类的时候 就可以使用限制泛型类,而创建泛型类实例的时候 刚开始不知道用什么类型 ,使用泛型通配符可能更好。

总结
最近的不论是身体状况还是精神状态都不是很好,一方面是想换个环境 最终因为没有拿出实际行动而导致的,另一方面则是 回家玩手机,把自己搞的辣鸡 很颓废,要调整过来不然就爆炸了 ,兄弟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值