Java泛型简单理解


1. 泛型是什么?
	>泛型是规定一个参数的类型,举个例子引出泛型


	@Test
	public void test4() {
		ArrayList array = new ArrayList();
		array.add("张三");
		array.add("李四无");
		array.add(12);

		// 迭代
		Iterator iterator = array.iterator();
		while (iterator.hasNext()) {
			String s = (String) iterator.next();//为了得知字符串长度
			System.out.println(s.length());
		}

	}


	>从上面例子可以看出编译期没问题,但是在运行时就报"java.lang.ClassCastException"
		也就是"类型转换异常"为什么会出现这种情况呢?因为在获取String的长度时,
		集合中不只有String类型数据
		在int自动装箱为Integer后强转String所以报错,
		为了解决这个问题出现了"泛型"来规定集合内传入的参数
		当加入泛型后"ArrayList<String> array = new ArrayList<String>();"可以看到add()
		参数传入整形后就会报错,不允许添加非String类型数据,避免了异常的产生
		

2. 泛型==伪泛型
	泛型只是在编译期规定,也就是说编译成.class文件后将没有泛型的存在

3. public class ArrayList<E>{} 类泛型
   public boolean add(E e) {} 方法泛型
   public interface List<E>{}
	可以看到类的后面,方法参数都有一个E,其实这个E只是一个变量,怎么理解呢
	当你"ArrayList<String> array = new ArrayList<String>();"那么类的泛型就会编程String,传入其他引用类型同理
	"array.add("张三");"当传入String后参数E也就变成了String其他引用类型同理

4. 泛型通配符"?"
	>在不知道类型的情况下尖括号内可以使用"?"来代替,但是需要注意得是尽量不要在类型不确定的情况下进行类型强制转换

5. 泛型的限定
	>规定参数类型必须是XX抽象类,接口,普通类的子类或父类,否则不允许传递
	>"上限限定"格式:public void iterator(ArrayList<? extends Employee> emp){} ?的类型必须是继承Employee的类型,也就是子类代码参考_5
	>"下限限定"格式public void iterator(ArrayList<? super Cook> emp) {} 将关键字改为 super意为只能传入其父类

_5


	import java.util.ArrayList;
	import java.util.Iterator;
	
	import org.junit.Test;
	
	abstract class Employee {
		public abstract void work(String name);
	
		public String name;
		public int age;
	}
	
	class Waiter extends Employee {
	
		@Override
		public void work(String name) {
			System.out.println("服务员 " + name + " 服务");
		}
	
		public Waiter(String name, int age) {
			this.name = name;
			this.age = age;
		}
	
	}
	
	class Cook extends Employee {
		public Cook() {
			super();
		}
	
		public Cook(String name, int age) {
			this.name = name;
			this.age = age;
		}
	
		@Override
		public void work(String name) {
			System.out.println("厨师 " + name + " 在做饭");
		}
	
	}
	
	public class DemoOne {
	
		@Test
		public void test1() {
			ArrayList<Waiter> waiter = new ArrayList<Waiter>();
			waiter.add(new Waiter("张三", 12));
			iterator(waiter);// 服务员
			ArrayList<Cook> cook = new ArrayList<Cook>();
			cook.add(new Cook("李四", 45));
			iterator(cook);// 厨师
		}
	
		public void iterator(ArrayList<? extends Employee> emp) {// 参数必须是Employee的子类,实现类
			Iterator<? extends Employee> iterator = emp.iterator();
			while (iterator.hasNext()) {
				Employee next = iterator.next();
				next.work(next.name);// 员工方法
			}
		}
	
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值