java基础之泛型
1.为什么需要泛型呢?
在泛型诞生之前,java中使用object
来代替任意类型的。比如你要往一个list中存储dog对象,但是你的同事接过你的代码后,往里面又存了cat对象,这样在取对象的时候,由于都是object对象,因此向下转型变得很困难且不安全。
2.泛型的定义
把明确类型的工作,推迟到创建对象或者调用方法的时候再去执行。
简单理解的话,泛型就像孙悟空一样,七十二变,编写程序的时候,就是本尊;程序运行时,会根据具体情况变换样貌,即兼容各种类型,直到最终能救出唐三藏,也就是代码的成功运行。
3.泛型的使用
3.1泛型类
package cn.suvue.discipline.practice.genericity;
import java.util.ArrayList;
import java.util.List;
/**
* 泛型类实例
*
* @author suvue
* @date 2019/12/28
*/
public class ObjectTool<T> {
private T obj;
/**
* set操作
*/
public void setObj(T obj){
this.obj = obj;
}
/**
* get操作
*/
public T getObj(){
return obj;
}
}
一句话概括:泛型让一个普通类转变成了万金油的类!
3.2泛型类
先贴出关键代码:
public<T> void show(T t){
System.out.println(t);
}
<T>
符号很关键,是一个泛型方法的灵活所在!
3.3泛型接口
public interface Inner<T> {
public abstract void show(T t);
}
不明确类型的实现方式
public class InnerImpl<T> implements Inner<T> {
@Override
public void show(T t) {
System.out.println(t);
}
}
明确类型的实现方式
public class InnerImplm implements Inner<String> {
@Override
public void show(String s) {
System.out.println(s);
}
}
3.4泛型通配符
public void foreachList(List<?> list) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
<?>可以接受任意类型,我们心中要明确的知道一点:Object是String类的顶级父类,但是List和List没有半毛钱关系!
另外,在foreachList方法中,我们只能使用与泛型无关的方法,例如get方法;而不能使用add()或者addAll()等方法,因为此时泛型的类型还行不确定的。
3.5通配符的上下限
简单来讲,就是对通配符的范围做了限制。
常见的有两种:
- List<? extends Number>只有Number类的子类才能使用。
- <List<? Super Type>只有Type类的父类才可以使用。
具体的使用在实际中很复杂,尤其是源码,此处只起到抛砖引玉的作用。
3.6泛型擦除
泛型只在编译时有效,运行时都会转变成object类型。