前面提到面向对象中存在多态这一特性,在向上造型的时候不会出现类型转换的错误,但是由于向下造型的时候 却可能出现类型转换的错误,毕竟不是所有的父类类型实例都是子类类型实例.所以为了避免程序员在创建更通用的方法时 将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传入数据类型的时候 指定了数据类型,所以取出来的时候就是传入的类型,这样也就省去了向下造型 类型转换错误的问题.
泛型的常规用法
- 定义泛型类的时候 传入多个类型
- 定义泛型类是声明数组类型
- 集合类中声明容器的元素
重点来看一下集合中声明容器的元素
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集合)
泛型的高级用法
- 限制泛型类类型
- 使用泛型通配符
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>();
}
}
从实际撸代码中可以看到 限制泛型类类型 一般用于泛型类的创建过程中,如果想要泛型类可以传入某个类或者其子类的时候 就可以使用限制泛型类,而创建泛型类实例的时候 刚开始不知道用什么类型 ,使用泛型通配符可能更好。
总结
最近的不论是身体状况还是精神状态都不是很好,一方面是想换个环境 最终因为没有拿出实际行动而导致的,另一方面则是 回家玩手机,把自己搞的辣鸡 很颓废,要调整过来不然就爆炸了 ,兄弟。