Java泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。当需要使用某一种算法时,又无法具体算法的数据类型,或者想指定类型值的上限或下限,那么这时就需要Java泛型来大显身手了!

  泛型方法的规则:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前。
  • 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。

  实例:

  一、定义一个泛型方法来打印对象数组元素

   public static <E> void printArray(E[] inputArray){
for(E elements:inputArray){
System.out.print(elements);
}
} public static void main(String[] args){
Integer[] intArray={4,5,6,5,8};
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' }; System.out.println( "整型数组元素为:" );
printArray( intArray ); System.out.println( "\n双精度型数组元素为:" );
printArray( doubleArray ); System.out.println( "\n字符型数组元素为:" );
printArray( charArray );
}

  二、定义一个泛型方法来对数字进行排序(extends 使用)

 public static <E extends Comparable> E searchMaxnumber(E x,E y,E z){
E maxNumber=x;
if(y.compareTo(maxNumber) > 0){
maxNumber=y;
}
if(z.compareTo(maxNumber)>0){
maxNumber=z;
}
return maxNumber;
} public static void main(String[] args){
System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",
3, 4, 5, searchMaxnumber( 3, 4, 5 ) );
System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\n\n",
6.6, 8.8, 7.7, searchMaxnumber( 6.6, 8.8, 7.7 ) );
System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","pear",
"apple", "orange", searchMaxnumber( "pear", "apple", "orange" ) );
}

  三、泛型类的定义

 public class GenericityExam<E> {

    private E e;

    public E get(){
return e;
} public void put(E e){
this.e=e;
} public static void main(String[] args) {
GenericityExam<Integer> integerVal = new GenericityExam<Integer>();
GenericityExam<Character> charVal = new GenericityExam<Character>(); integerVal.put(new Integer(10));
charVal.put(new Character('s')); System.out.printf("整型值为 :%d\n", integerVal.get());
System.out.printf("字符为 :%c\n", charVal.get());
} }

  四、类型通配符上限泛型


public static <E> void listGen(List<? extends E> data){
for(E listData:data){
System.out.println("data :" + listData);
}
} public static void main(String[] args) {
List<Integer> listIn = new ArrayList<>();
List<Number> listNu = new ArrayList<>(); listIn.add(18);
listIn.add(45);
listNu.add(314);
listNu.add(789); listGen(listIn);
listGen(listNu);
}
  • <? extends E>表示该通配符所代表的类型是E类型的子类。
  • <? super E>表示该通配符所代表的类型是E类型的父类。

  泛型定义好后,在运行期间会变化为Object类型。

Java泛型理解的更多相关文章

  1. java泛型理解。代码更明了。

    泛型数据java基础,但真正理解需要悉心品尝.毕竟在工作中用到的是在是太多了. 不要以为new ArrayList<>这就是泛型,这只能属于会使用. 在工作中,相对于现有的项目源码的数据库 ...

  2. Java学习笔记(二一)——Java 泛型

    [前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...

  3. 对java泛型的理解

    正确的应用java泛型的特性可以更好的实现编程的开闭原则(对扩展开放,对修改关闭),这得益于java泛型提供的在程序运行时获取对象声明类型的特性. 静态语言的特性是在程序编译前进行声明,这样程序在编译 ...

  4. 大白话说Java泛型(二):深入理解通配符

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(二):深入理解通配符> 上篇文章<大白话说Java泛型(一):入门.原理.使用>,我们讲了泛型的产生缘由以及 ...

  5. java泛型的理解

    总体介绍泛型: 1.泛型是计算机程序中一种重要的思维方式,它将数据结构和算法与数据类型相分离,使得同一套数据结构和算法,能够应用于各种数据类型,而且还可以保证类型安全,提高可读性.在Java中,泛型广 ...

  6. Java泛型深入理解(转载)

    原文地址  http://blog.csdn.net/sunxianghuang/article/details/51982979 泛型之前 在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将 ...

  7. Java 泛型 <? super T> 中 super 怎么 理解?与 < ? extends T>有何不同?

    Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同? 简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型数组.在泛型的使用中,还有个重要的 ...

  8. 理解Java泛型 通配符 ? 以及其使用

    什么是泛型: 泛型从字面上理解,是指一个类.接口或方法支持多种类型,使之广泛化.一般化和更加通用.Java中使用Object类来定义类型也 能实现泛型,但缺点是造成原类型信息的丢失,在使用中容易造成C ...

  9. 深入理解什么是Java泛型?泛型怎么使用?【纯转】

    本篇文章给大家带来的内容是介绍深入理解什么是Java泛型?泛型怎么使用?有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助. 一.什么是泛型 “泛型” 意味着编写的代码可以被不同类型的对象所 ...

随机推荐

  1. spring aop,静态及动态代理例子

    @Aspect@Componentpublic class AopText { @Pointcut("execution(public * com.llf.service.*Service. ...

  2. cesium.js 设置缩放最大最小限制

    viewer.scene.screenSpaceCameraController.minimumZoomDistance = 1200;viewer.scene.screenSpaceCameraCo ...

  3. 启动 NFS 守护进程:rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)

    启动 NFS 守护进程:rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused) rpc.nfsd: unable t ...

  4. [LuoguP2403][SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  5. 所有流媒体协议,编解码规范和媒体封装格式的datasheet的下载地址

    https://github.com/jiayayao/DataSheet All datasheet about stream protocol, encode-decode spec and me ...

  6. vlc源码分析(一) RTSP会话流程

    可以先了解一下RTSP/RTP/RTCP的概念与区别:RTP与RTCP协议介绍(转载). 在调试vlc-android时,熟悉了RTSP的会话流程.C表示RTSP客户端,S表示RTSP服务端: 第一步 ...

  7. Angular动态表单生成(二)

    ng-dynamic-forms源码分析 在两个开源项目中,ng-dynamic-forms的源码相较于form.io,比较简单,所以我还勉强能看懂,下面就我自己的理解进行简单分析,若有不对的地方,请 ...

  8. everything对已经不存在的文件还进行索引,报错“系统找不到指定的驱动器”

    使用everything时,总是报下面的错.也就是对于已经不存在的文件或者文件夹还保留着对应的索引. 如下图: 这个其实我们在选项中设置一下规则就可以了. 一. 二. 三. ok啦.

  9. iOS:时间相关(18-10-13更)

    先整理出时间相关的程序,以后有空再写成单例. 1.日历(NSCalendar) 2.时间格式() 3.时间戳 附录: 1.定时器 1.日历(NSCalendar) 1.想要获取 世纪.年.月.日.时. ...

  10. 留言板(初学者使用js实现)

    代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...