泛型

泛型

泛型的概念:

泛型有安全机制在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、不限制类型(集合本身的使用就是不限制类型的使用方式)
用途:可以封装简化代码
可以在类上或方法上去定义类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值