泛型
泛型的概念:
泛型有安全机制在JDK1.5版本后,避免了在运行时有错误,讲异常从运行提前到编译时期,更好的解决问题,在迭代器规定了泛型的情况下,就不需要类型强制转换了,不需要强制类型转换就不会存在安全的问题
泛型标准:<数据类型>
之前学数组的时候,数组有一个特点,是类型唯一
后来学集合,对于数据类型是任意的要求(只能是引用数据类型,对基本数据类型而言存储的是其包装类)
泛型可以使用任意的类型,泛型泛型意思就是广泛的类型
我们来看看泛型都有什么作用和有什么样的类型:
限制类型和无限制类型是对立的
限制类型:
限制类型,限制集合中所能存储的数据类型,不用强制类型转换,将错误提前到了编译时期
ArrayList后面的泛型在1.7之前需要显示指明类型,1.8以后可以不写
规定泛型后,无法写除规定泛型外的数据类型,写了就会报错
泛型有安全机制在JDK1.5版本后,避免了在运行时有错误,讲异常从运行提前到编译时期,更好的解决问题,在迭代器规定了泛型的情况下,就不需要类型强制转换了,不需要强制类型转换就不会存在
无限制类型:泛型可以使用任意的类型,泛型泛型意思就是广泛的类型
不限制类型 ,不限制和不给定泛型,默认是Object类型是一样的效果,可以简单的理解为将Object类型显示的给指明出来,但是呢,不明确的说是Object类型,而是换了一种形式,使用泛型代替(一个字母);
什么情况下是不需要限制类型:
集合本身是可以不限制类型,所以集合里面可以添加任意的类型,可以添加任意的类型是因为她也不知道你拿集合是要干啥
限制类型的目的是为了考虑安全,不限制类型的目的是为了效率和简洁性
接下来我们来看一下代码:
/*
* 用于获取对应的商品信息列表
* 泛型定义为实体类,只能获取这个实体里的东西
*/
public static List<Item> getItems(){
//此处应该是要链接数据库,获取数据,将数据存储到集合中
List<Item> list=new ArrayList<Item>();
//把实体类添加进集合,返回集合
list.add(new Item());
return list;
}
而我们的限定泛型呢,就是说泛型里面限定一个基本数据类型或者引用数据类型,那么限定了之后,在后面我们的添加等操作,就只能写我们限定泛型的类型,要不就会报错
遍历集合输出字符串及其长度
要求:集合中的数据类型必须是一致的
限制泛型:泛型:jdk1.5版本,安全机制,将异常从运行时提前到了编译时,也不需要进行强制转换
特殊符号:<强制转换>
没有了强制转换,就相当于有了安全,所以这是我们限制泛型的一个好处
public static void method() {
//ArrayList后面的泛型在1.7之前需要显示指明类型,1.8以后可以不写
List<String> list=new ArrayList<String>();
list.add("大计基");
list.add("大买卖");
//无法写除String类型以外的类型
// list.add(24);
list.add("apple");
//迭代器加泛型,里面不需要强制转换,不强制转换就不会出现安全问题
//那么迭代器里面也只能迭代这个泛型
Iterator<String> it=list.iterator();
while(it.hasNext()) {
//使用instanceof进行判断时为了保证程序在运行状态下不至于出现问题
//String str=(String)it.next();
String str=it.next();
System.out.println(str+"--"+str.length());
}
}
接下来,我们来看一下不限泛型的写法和用途
public class Custom<A> {
/**
* Sql决定了该方法区数据库中获取的数据类型
* @param sql
* @return
*/
public static List<Object> getAll(String sql){
List<Object> list=new ArrayList<>();
return list;
}
public List<A> getAlls(String sql){
List<A> list=new ArrayList<>();
return list;
}
public void show(A a) {//{A a="afsg"; Object obj="sfasf"};
}
/*
* 在方法上定义类型 该类型要定义在修饰符后(public),返回值类型前(void)
*/
public <B> void run(B b) {
System.out.println(b);
}
该类中封装了所有数据类型需要用到的请求数据功能
Object是所有类的超类(类的统称),语义不是很明确
因此会选择使用26个英文字母来代替,在开发语言中所有的命名都是以英语为主
在使用的时候只需要将对应的英语单词的首字母作为类型即可,例如:Key-K,Value-V,Element-E
但是,系统本身是无法直接识别英语作为一个类型,因此,就需要在使用之前先指定某个字母作为类型
指定方式:
在类上指定
该字母可以作为一个类型在整个类中使用(相当于成员变量的作用域)
在方法上指定
该字母可以在该方法中作为一个类型使用(相当于局部变量的作用域)
注意:自定义泛型不能用在静态变量或方法上
泛型有两大用途
1、限制类型
2、不限制类型(集合本身的使用就是不限制类型的使用方式)
用途:可以封装简化代码
可以在类上或方法上去定义类型