黑马程序员之泛型实例

------- android培训java培训、期待与您交流! ----------

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的 强制类型转换 ,而这种转换是要求开发者对 实际参数 类型可以预知的情况下进行的。对于 强制类型转换 错误的情况, 编译器 可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查 类型安全 ,并且所有的 强制转换 都是 自动 隐式 的,提高代码的重用率。

通常在集合框架中泛型很常见。在API中有<>的地方,就可以定义泛型。

规则和限制:

1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的 泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是 通配符类型。例如Class<?> classType = Class.forName("java.lang.String");

泛型类:

package fighting;

public class GenericClass {

	/**
	 * 泛型类:使用了泛型的类
	 * 
	 * 当类中要操作的引用数据类型不确定的时候,
	 * 早期定义Object来完成扩展
	 * jdk1.5以后定义泛型来完成扩展
	 */
	public static void main(String[] args) {
		//未使用泛型类
		Tool t1 = new Tool();
		//传入的是Worker的实例对象
		t1.setObj(new Worker());
		//传入Worker实例,获取Farmer对象,这样在编译时不会异常,在运行时就会报java.lang.ClassCastException的异常
		Farmer f = (Farmer)t1.getObj();
		System.out.println(f);
		
		//使用泛型类
		Utils<Worker> u1 = new Utils<Worker>();
		u1.setObj(new Worker());
		//泛型优势:不需要使用强制转换类型
		Worker w = u1.getObj();
		//泛型优势:使用了泛型类,则传入Worker实例,获取Farmer对象,在编译时就会报错,这样
//		Farmer f1 =u1.getObj();
//		System.out.println(f1);
		
	}

}

class Worker{
}

class Farmer{
}
//未使用泛型的工具类
class Tool{
	private Object obj;

	public void setObj(Object obj){
		this.obj=obj;
	}
	public Object getObj() {
		return obj;
	}
	
}
//使用了泛型的工具类
class Utils<T>{
	private T obj;
	public void setObj(T obj){
		this.obj = obj;
	}
	
	public T getObj(){
		return obj;
	}
}


泛型方法:

package fighting;

public class GenericMethod {

	/**
	 * 泛型类的局限性:
	 * 泛型类定义的泛型整个类中有效,这个类中所有方法操作的这个类型就固定了.
	 * 如果想实现不同方法操作不同类型,而且类型还不确定,那么可以讲泛型定义在方法上.
	 * 
	 * 泛型方法:相比较泛型类而言,泛型方法更灵活些
	 * 注意:泛型定义在方法上,泛型的定义要在返回值前面
	 * 
	 * 特殊之处:
	 * 静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,
	 * 可以将泛型定义在方法上
	 * 
	 */
	public static void main(String[] args) {
		
		Demo<String> d = new Demo<String>();
		d.show("haha");
//		d.print(4);//由于泛型类的局限性,这句代码会报异常
		
		Demo2 d2 = new Demo2();
		d2.show("hahahaha");
		d2.show(4);
		d2.print("heihei");
		d2.print(44);
	}

}
//泛型类
class Demo<T>{
	public void show(T t){
		System.out.println("show:"+t);
	}
	public void print(T t){
		System.out.println("print:"+t);
	}
	//静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上
	public static <W> void method(W w){
		System.out.println("method"+w);
	}
}
//泛型方法
class Demo2{
	public <T> void show(T t){
		System.out.println("show:"+t);
	}
	public <E> void print(E e){
		System.out.println("print:"+e);
	}
}


泛型接口:

package fighting;

public class GenericInterface {

	/**
	 * 泛型接口:
	 * 接口上定义了泛型,在接口的实现类上要指定要操作的数据类型
	 * 如果实现类要操作的数据类型也不确定,可以把实现类定义为泛型
	 */
	public static void main(String[] args) {
		InterImpl i = new InterImpl();
		i.show("ok");
		
		InterImpl2<Integer> i2 = new InterImpl2<Integer>();
		i2.show(22);

		InterImpl2<String> i3 = new InterImpl2<String>();
		i3.show("okok");	
	}

}

interface Inter<T>{
	void show(T t);
}
//这个实现类只能操作String
class InterImpl implements Inter<String>{
	public void show(String t){
		System.out.println("show:"+t);
	}
}

class InterImpl2<T> implements Inter<T>{
	public void show(T t){
		System.out.println("show:"+t);
	}
}


泛型限定:

package fighting;

import java.util.ArrayList;
import java.util.Iterator;

public class GenericLimit {

	/**
	 * 泛型限定:
	 * ?是通配符,也可以理解为占位符
	 * ? extends E:向上限定,可以接受E类型后者E的子类型
	 * ? super E:向下限定,可以接受E类型或者E的父类型
	 */
	public static void main(String[] args) {
		ArrayList<String> a1 = new ArrayList<String>();
		a1.add("abc1");
		a1.add("abc2");
		a1.add("abc3");

		ArrayList<Integer> a12 = new ArrayList<Integer>();
		a12.add(1);
		a12.add(6);
		a12.add(4);
		
		printColl(a1);
		printColl(a12);
		
		//泛型限定
		ArrayList<Person1> al3 = new ArrayList<Person1>();
		al3.add(new Person1("aaa"));
		al3.add(new Person1("bbb"));
		al3.add(new Person1("ccc"));
		
		ArrayList<Student1> al4 = new ArrayList<Student1>();
		al4.add(new Student1("aaa1"));
		al4.add(new Student1("bbb1"));
		al4.add(new Student1("ccc1"));
		//编译异常:相当于ArrayList<Student1> al4= new ArrayList<Person1>(),前后泛型类型不一致
		//printColl2方法中使用泛型限定即可解决
		printColl2(al4);
		

	}
	//?是占位符,这里也可以用T(代表一种数据类型TYPE),两者区别不大
	public static void printColl(ArrayList<?> s1){
		Iterator<?> it = s1.iterator();
		
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
	
	public static void printColl2(ArrayList<? extends Person1> s1){
//		Iterator<Person1> it = s1.iterator();
		Iterator<? extends Person1> it = s1.iterator();
		
		while(it.hasNext()){
			System.out.println(( it.next()).getName());
		}
	}

}

class Person1{
	private String s;
	public Person1(String s){
		this.s=s;
	}
	public String getName(){
		return s;
	}
}

class Student1 extends Person1{
	public Student1(String s){
		super(s);
	}
}


 

两个特殊的小例子:

例1:

/**
 * Map的key和value的组合体用一个特定的类表示,叫Map.Entry
 * 现在要用这个Entry来迭代出每个元素
 */
  HashMap<String,Integer> maps =new HashMap<String,Integer> ();
  maps.put("zxx", 28);
  maps.put("lhm", 35);
  maps.put("fix", 33);
  //Map是不能直接进行迭代的,因为Map没有实现iterable接口
  //要把Map编程Set,Set里面装着每个Entry,然后利用Set进行迭代
  //注意=左边的参数化类型,entrySet()方法的返回值是Set<Map.Entry<K,V>>泛型类型
  Set<Map.Entry<String,Integer>> entrySet  = maps.entrySet();
  for(Map.Entry<String, Integer> entry:entrySet){
   System.out.println(entry.getKey() + ":" + entry.getValue());
  }

 

输出结果:

fix:33
zxx:28
lhm:35

例2:

//交换的方法

 //利用泛型实现交换两个元素的位置
 private static <T> void swap(T[] a,int i,int j){
  T temp = a[i];
  a[i] = a[j];
  a[j]=temp;
 }

//调用交换的方法

 public static void main(String[] args) throws SecurityException, Exception {

  String[] swapStr = new String[]{"abc","xyz","itcast"};
  swap(swapStr,1,2);
  System.out.println(Arrays.asList(swapStr));
  //注意下面这句会编译报错:因为泛型T的实际类型只能是对象类型,不能是基本类型,int是基本类型
//  swap(new int[]{1,2,5,4,5},3,4);
  //想要交换数字可以像下面这样定义成对象类型的
  Integer[] swapInteger = new Integer[]{1,2,5,4,3};
  swap(swapInteger,3,4);
  System.out.println(Arrays.toString(swapInteger));

 }

输出结果:

[abc, itcast, xyz]
[1, 2, 5, 3, 4]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值