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

泛型的长处

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

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

<>在当操作的引用数据类型不确定的时候使用,将要操作的引用数据类型导入就可以,事实上<>就是一个用于接收详细引用数据类型的參数范围

在敲代码时,仅仅要用到了带<>的类或接口。就必需要明白传人的详细引用数据类型

import java.util.ArrayList;
import java.util.Iterator;
public class Main 
{
public static void main(String[] args) {
>ArrayList<String> al = new ArrayList<String>();//明白ArrayList集合仅仅放 字符串
al.add("abc");
al.add("sd");
Iterator<String> it = al.iterator();//迭代器也明白后。以下就不须要强转了
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}
}
}

泛型技术是给编译器使用的。用于编译时期。是为了确保类的安全,执行时,生成的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());
}
}

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

package assa;

import java.util.List;

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 <T> void ArrayToList(T[] Ts,List<T> list){
for(T t : Ts){
list.add(t);
}
} public <T> T getT(T t){ // <T> 假设是本类声明过的泛型 ,比方 E 在使用时不加 <X>,
return t; //而 T 和 E 都没有声明 ,所以须要 声明
}
//public static void mhtod(E e){ }假设是静态訪问类上定义泛型。就会编译失败,静态是不须要对象的 //改动,仅仅能将泛型定义方法上
public static <F> void mthod(F str){
System.out.println("Tool.mthod()"+str);
}
}
public class ddd
{
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'); }
}

泛型的优点:

攻克了比方集合中元素存储的安全性问题,(假设不使用泛型,一个存放Customer类的List集合,也能够存放String类),而使用泛型后。List仅仅能放Customer类型

攻克了获取数据时。强转的弊端,由于List放的都是Customer类自然不须要强转

泛型的弊端

上述show方法中,假设传入的是String。无法使用str.length()方法,由于泛型的类型是不确定的,就无法确定到某个类的方法,仅仅能使用一些Object的一些方法



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

  1. 【原】Java学习笔记027 - 泛型

    package cn.temptation.test; import java.util.ArrayList; import java.util.Iterator; public class Samp ...

  2. 【Java学习笔记】泛型

    泛型: jdk1.5出现的安全机制 好处: 1.将运行时期的问题ClassCastException转到了编译时期. 2.避免了强制转换的麻烦. <>: 什么时候用? 当操作的引用数据类型 ...

  3. JAVA学习第一课(初识JAVA)

    PS:退ACM集训队了,自己也疯玩了两天,后天就开学了,就正式大二了,该收收心好好学习啦                                                         ...

  4. Java学习6之泛型

    1.泛型定义 1.泛型类: public class Generic <T>{ public void get(T t){ System.out.println(t); } } examp ...

  5. java学习笔记之泛型

    "泛型"这个术语的意思就是:"使用与许多许多的类型".泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力.如何做到这一点呢,正是通过解耦 ...

  6. java学习——集合框架(泛型,Map)

    泛型: ... Map:一次添加一对元素.Collection 一次添加一个元素. Map也称为双列集合,Collection集合称为单列集合. 其实map集合中存储的就是键值对. map集合中必须保 ...

  7. JAVA学习第一课-手工笔记

    JVM:JAVA虚拟机,JAVA核心,跨平台,作用是翻译. JRE:运行环境,包含JVM和运行的核心类库. JDK:全新开发使用,包含JRE,编译工具: 核心是JVM 以下是关系库 安装路径不要有空格 ...

  8. Java 学习(17): Java 泛型

    Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说将 ...

  9. Java学习——泛型

    Java学习——泛型 摘要:本文主要介绍了什么是泛型,为什么要用泛型,以及如何使用泛型. 部分内容来自以下博客: https://www.cnblogs.com/lwbqqyumidi/p/38376 ...

随机推荐

  1. [ NOI 2002 ] 银河英雄传说

    \(\\\) Description 有 \(n\) 列战场,每一列一开始只有一个战舰,编号就是对应的战场编号. 有 \(m\) 次操作: \(M_{i,j}\) :把 \(i\) 所在的一整列接在 ...

  2. python自动化--语言基础一数据类型及类型转换

    Python中核心的数据类型有哪些?变量(数字.字符串.元组.列表.字典) 什么是数据的不可变性?哪些数据类型具有不可变性数据的不可变是指数据不可更改,比如: a = () #定义元组 #a[]= # ...

  3. Eclipse+JUnit+Selenium配置

    运行环境:Windows XP.Firefox.Firefox需要安装在标准路径下"C:\Program Files\Mozilla Firefox\firefox.exe",否则 ...

  4. 远程监视jboss应用java内存的配置(实测) .

    前言 因为最近一个项目部署在客户那边运行一个月左右就会出现java内存溢出的问题,为了时时监控java内存的情况需要,需要远程查看服务器上java内存的一些情况.在公司模拟部署了远程监视linux下项 ...

  5. 动态设置缩放比例和html字体大小

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  6. 自定义 Java Annotation ,读取注解值

    1. 首先是自定义注解: package cn.veji.hibernate.po; import java.lang.annotation.ElementType; import java.lang ...

  7. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  8. Java基础(三)--final关键字

    final通常是指"不可改变的",例如我们使用的常量 通常可以有三种使用情况: 一.final修饰数据 如果final修饰数据,也就是通常所说的常量,从字面上看,常量就是不能修改的 ...

  9. Redis系列(三)--消息队列、排行榜等

    Redis命令执行生命周期: 发送命令--->排队(单线程)--->执行命令--->返回结果 慢查询: 只是针对命令执行阶段 慢查询日志通过一个固定长度的FIFO queue,这个q ...

  10. Introduction of Version Control/Git, SVN

    什么是版本控制? 你可以把一个版本控制系统(缩写VCS)理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照.当你需要查看一个之前的快照(称之为“版本”)时,版本控制系统可以显示出当 ...