JAVA学习第四十一课 — 泛型的基本应用(一)

泛型是JDK1.5以后出现的安全机制,简化机制,提高安全性

泛型的优点

1.将运行时出现的问题ClassCastException转移到了编译时期

2.避免了强制转换的麻烦

<>在当操作的引用数据类型不确定的时候使用,将要操作的引用数据类型导入即可,其实<>就是一个用于接收具体引用数据类型的参数范围

在写程序时,只要用到了带<>的类或接口,就必须要明确传人的具体引用数据类型

import java.util.ArrayList;
import java.util.Iterator;
public class Main 
{
<span style="white-space:pre">	</span>public static void main(String[] args) {
<span style="white-space:pre">		</span>ArrayList<String> al = new ArrayList<String>();//明确ArrayList集合只放 字符串
<span style="white-space:pre">		</span>al.add("abc");
<span style="white-space:pre">		</span>al.add("sd");
<span style="white-space:pre">		</span>Iterator<String> it = al.iterator();//迭代器也明确后,下面就不需要强转了
<span style="white-space:pre">		</span>while(it.hasNext()){
<span style="white-space:pre">			</span>String str = it.next();
<span style="white-space:pre">			</span>System.out.println(str);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
}

泛型技术是给编译器使用的,用于编译时期,是为了确保类的安全,运行时,生成的class文件是不带泛型的,会将泛型去掉,这就是泛型的擦除,擦除的原因是为了兼容运行的类的加载器(如果不擦除也就意味着加载器也要升级,所以要擦除)

因为有了泛型的擦除,也就引出了泛型的补偿技术,在运行时,通过获取元素的类型进行转换动作,就不需要再强制转换了

泛型在集合中的应用

import java.util.Iterator;
import java.util.TreeSet;

public class Man implements Comparable<Man>{
	private int age;
	private String name;
	public Man() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Man(String name,int age) {
		super();
		this.age = age;
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return super.equals(obj);
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public int compareTo(Man m) {
		// TODO Auto-generated method stub
		int t = this.name.compareTo(m.name);
		return 	t==0?t:this.age-m.age;
	}

}

public class Main
{
	public static void main(String[] args) {

		TreeSet<Man> ts = new TreeSet<Man>();//可以构造一个比较器
		ts.add(new Man("a",1));
		ts.add(new Man("a",4));
		ts.add(new Man("b",5));
		ts.add(new Man("d",2));
		ts.add(new Man("c",7));
		Iterator<Man> it = ts.iterator();
		while(it.hasNext()){
			Man m = it.next();
			System.out.println(m.getName()+","+m.getAge());
		}
	}
}

自定义泛型类

//定义一个工具类操控所有对象
/*public class Tool {
	private Object obj;//为了提高扩展性用Object

	public Object getObj() {
		return obj;
	}

	public void setObj(Object obj) {
		this.obj = obj;
	}
}
*/
//JDK1.5以后  自定义泛型类,当类中操作的引用数据类型不确定的时候,就用泛型来表示
public class Tool<E> {

	private E e;

	public E getObj() {
		return e;
	}

	public void setObject(E obj) {
		this.e = obj;
	}

}

public class Student extends Man{//Man类在上面有

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(String name, int age) {
		super(name, age);
		// TODO Auto-generated constructor stub
	}
}
public class Worker extends Man {

	public Worker() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Worker(String name, int age) {
		super(name, age);
		// TODO Auto-generated constructor stub
	}
}
public class Main
{
	public static void main(String[] args) {
		//JDK1.5以前
		/*Tool to  = new Tool();
		to.setObj(new Worker());//一旦不小心传个Worker,编译时,通过,运行时,异常ClassCastException
		Student student = (Student)to.getObj();//但是需要强转*/
		//JDK1.5以后
		Tool<Student> to = new Tool<Student>();
		to.setObject(new Student());//一旦不小心传个Worker,编译就会不通过,和就体现了泛型的好处,检测提到了编译时期
		Student student = to.getObj();
		System.out.println(student.getClass());
	}
}

泛型方法:在方法中定义泛型

class Tool<E> {

	private E e;

	public E getObj() {
		return e;
	}

	public void setObject(E obj) {
		this.e = obj;
	}
	public<O> void show(O str){ //将泛型定义在方法上,传什么类型,就打印什么类型
			System.out.println("Tool.show()"+str);
	}
	public<O> void printf(O str){
		System.out.println("Tool.printf()"+str);
	}
	//public static void mhtod(E e){ }如果是静态访问类上定义泛型,就会编译失败,静态是不需要对象的

	//修改,只能将泛型定义方法上
	public static <F> void mthod(F str){
		System.out.println("Tool.mthod()"+str);
	}
}
public class Main
{
	public static void main(String[] args) {
		Tool<String> to = new Tool<String>();
		to.show("asd");
		to.show(new Integer(5));
		to.printf("pri");//而printf除了string其他的都不行
		Tool.mthod("哈哈");
		Tool.mthod('f');

		}
}

泛型的弊端

上述show方法中,如果传入的是String,无法使用str.length()方法,因为泛型的类型是不确定的,就无法确定到某个类的方法,只能使用一些Object的一些方法

时间: 2024-10-30 11:21:35

JAVA学习第四十一课 — 泛型的基本应用(一)的相关文章

Java学习笔记_26_泛型概述

                                                               泛型概述 在Java中存入容器中的对象再取出时需要转换类型,因为对象加入容器会被转换成Object类型,而取出时要转换成实际类型.但向  下类型转换都 是存在潜在危险的,因此应该尽量避免它们.  Java的泛型: 所谓泛型就是在定义(类.方法.形参.成员变量等等)的时候,指 定它们为通用类型,也就是数据类型可以是任意类型. 泛型为提高大型程序的类型安全和维护带来了很大的潜

JAVA学习第一课(初识JAVA)

PS:退ACM集训队了,自己也疯玩了两天,后天就开学了,就正式大二了,该收收心好好学习啦                                                                                  JAVA概述 首先先复习一下基础常识: 1.软件开发 2.人机交互 3.经常使用的DOS命令 一.软件开发 什么是软件? 软件是一系列依照特定顺序组织的计算机数据和指令集合(指令:是处理数据的方式) 常见的软件有:系统软件(DOS.WIndows.

Java学习总结-08 泛型

一 泛型(Generic) 1 泛型介绍 1 泛型是在JDK1.5以后增加的新功能.泛型(Generic) 2 泛型可以解决数据类型的安全性问题,主要的原理,是在类声明的时候通过一个标识,表示类中某个属性的类型或者是某个方法的返回值及参数类型. 3 格式: 访问权限 class 类名称<泛型,泛型...>{ 属性 方法 } 4 对象的创建 类名称<具体类型> 对象名称 = new 类名称<具体类型>(); 一般表示泛型使用大写的字母 T . 5 例子不使用泛型以前,怎么

JAVA学习第一课

                                          JAVA概述 首先先复习一下基础常识: 1.软件开发 2.人机交互 3.常用的DOS命令 一.软件开发 什么是软件? 软件是一系列按照特定顺序组织的计算机数据和指令集合(指令:是处理数据的方式) 常见的软件有:系统软件(DOS.WIndows.Linux),应用软件(QQ.360.迅雷) 所以,软件开发就是指制作软件,将一系列的数据和集合组织起来 二.人机交互 软件使人和计算机更好的交互 交互方式: 1.图形化界

java 学习第一课,JDK工具包的安装

1. jdk 的下载 目前为止,jdk的最新版是jdk8,http://www.oracle.com/technetwork/java/javase/downloads/index.html 到这里下载  目前我用的是win7 64位操作系统,所以下载如下这个连接: 2. JDK 8 的安装 安装时,对话框 会先让你安装 JDK,我选择 E:\java\jdk8 这个安装好之后,会让你再选择一个目标文件夹,用于安装JRE, 这里要注意的是,不能与之前的JDK安装在一个目录中,否则环境变量将设置不

JAVA学习第九课(关键字二static)

关键字二. static(静态) 特点: static 用于修饰成员(成员函数和成员函数) static的存在,优先于对象存在,随着类的加载而加载 static所修饰的成员,被所有对象共享 static可以直接被类名调用,格式:System.out.println(Person.country);:类名.静态成员 使用细节 静态方法只能访问静态成员,即static修饰的成员,static int data; 静态方法不可以写this.super:this代表着当前调用该方法的对象. 主函数(ma

JAVA学习第九课(关键字一)

关键字: this 关键字 this 使用一: 直接以代码解释: class Man { private int age; private String name; Man() { name= null;age = 0; } Man(String n)//正常直接打印"BLF,0",但是把n改为name呢,就会打印null,0 { name = n; }//改成name虽然增加了阅读性,但是参数名进栈时,栈区已经有了一个局部变量名name, 那么name的赋值,只会把自己赋值给自己.如

黑马程序员——JAVA学习笔记九(泛型)

1,    泛型机制是JAVA5才支持,使用泛型机制编写的代码比那些杂乱地使用Object变量,然后再强制类型转换的代码具有更好的安全性和可读性. 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用,在泛型出来以前,泛型程序设计是继承Object来实现的.但是有缺点:1,当获取一个值必须要强制类型转换.2,没有类型检查错误,运行时才会出错.泛型提供了类型参数,解决了此问题.   2,    定义泛型类(generic class).格式: public class Pair<T, U>

恶补java(十)---泛型与集合的再学习

其余的就不多说了,一切都在代码中 package com.gc.generic; /** * JDK5 之前集合对象使用问题: * 1.向集合添加任何类型对象 * 2.从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换 * 存在安全隐患 * * ***************************** * * JDK5中的泛型:允许程序员使用泛型技术限制集合的处理类型 * List<String> list=new ArrayList<String>(); * 从而