加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

聊一聊Java 泛型全解

发布时间:2019-08-29 22:37:28 所属栏目:优化 来源:来一杯82年的Java
导读:副标题#e# 对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。 1、泛型的概述: 1.1 泛型的由来 根据《Java编程思想》中的描述,泛型出现的动机: 有
副标题[/!--empirenews.page--]

对于java的泛型我一直属于一知半解的,平常真心用的不多。直到阅读《Effect Java》,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来。

聊一聊Java 泛型全解

1、泛型的概述:

1.1 泛型的由来

根据《Java编程思想》中的描述,泛型出现的动机:

有很多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。

泛型的思想很早就存在,如C++中的模板(Templates)。模板的精神:参数化类型

1.2 基本概述

  • 泛型的本质就是"参数化类型"。一提到参数,最熟悉的就是定义方法的时候需要形参,调用方法的时候,需要传递实参。那"参数化类型"就是将原来具体的类型参数化
  • 泛型的出现避免了强转的操作,在编译器完成类型转化,也就避免了运行的错误。

1.3 泛型的目的

Java泛型也是一种语法糖,在编译阶段完成类型的转换的工作,避免在运行时强制类型转换而出现ClassCastException,类型转化异常。

1.4 实例

JDK 1.5时增加了泛型,在很大的程度上方便在集合上的使用。

不使用泛型:

  1. public static void main(String[] args) { 
  2.  List list = new ArrayList(); 
  3.  list.add(11); 
  4.  list.add("ssss"); 
  5.  for (int i = 0; i < list.size(); i++) { 
  6.  System.out.println((String)list.get(i)); 
  7.  } 
  8.  } 

因为list类型是Object。所以int,String类型的数据都是可以放入的,也是都可以取出的。但是上述的代码,运行的时候就会抛出类型转化异常,这个相信大家都能明白。

使用泛型:

  1. public static void main(String[] args) { 
  2.  List<String> list = new ArrayList(); 
  3.  list.add("hahah"); 
  4.  list.add("ssss"); 
  5.  for (int i = 0; i < list.size(); i++) { 
  6.  System.out.println((String)list.get(i)); 
  7.  } 
  8.  } 

在上述的实例中,我们只能添加String类型的数据,否则编译器会报错。

2、泛型的使用

泛型的三种使用方式:泛型类,泛型方法,泛型接口

2.1 泛型类

泛型类概述:把泛型定义在类上

定义格式:

  1. public class 类名 <泛型类型1,...> { 
  2.   

注意事项:泛型类型必须是引用类型(非基本数据类型)

2.2 泛型方法

泛型方法概述:把泛型定义在方法上

定义格式:

public <泛型类型> 返回类型 方法名(泛型类型 变量名) { }

注意要点:

方法声明中定义的形参只能在该方法里使用,而接口、类声明中定义的类型形参则可以在整个接口、类中使用。当调用fun()方法时,根据传入的实际对象,编译器就会判断出类型形参T所代表的实际类型。

  1. class Demo{  
  2.  public <T> T fun(T t){ // 可以接收任意类型的数据  
  3.  return t ; // 直接把参数返回  
  4.  }  
  5. };  
  6. public class GenericsDemo26{  
  7.  public static void main(String args[]){  
  8.  Demo d = new Demo() ; // 实例化Demo对象  
  9.  String str = d.fun("汤姆") ; // 传递字符串  
  10.  int i = d.fun(30) ; // 传递数字,自动装箱  
  11.  System.out.println(str) ; // 输出内容  
  12.  System.out.println(i) ; // 输出内容  
  13.  }  
  14. }; 

2.3 泛型接口

泛型接口概述:把泛型定义在接口

定义格式:

  1. public interface 接口名<泛型类型> { 
  2.   

实例:

  1. /** 
  2.  * 泛型接口的定义格式: 修饰符 interface 接口名<数据类型> {} 
  3.  */ 
  4. public interface Inter<T> { 
  5.  public abstract void show(T t) ; 
  6. /** 
  7.  * 子类是泛型类 
  8.  */ 
  9. public class InterImpl<E> implements Inter<E> { 
  10.  @Override 
  11.  public void show(E t) { 
  12.  System.out.println(t); 
  13.  } 
  14. Inter<String> inter = new InterImpl<String>() ; 
  15. inter.show("hello") ; 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读