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. 人人开源之代码生成器(renren-generator)

    本篇文章,主要包含三个部分,介绍.代码生成演示.代码分析(不会很深入)等 三个部分足以让你学会使用,实际生产可能遇到的问题不会在这遇到. 代码生成器的作用在于提高开发效率.但是这个代码生成器仍有其局限 ...

  2. php编译安装报错

    Cannot find OpenSSL's <evp.h> 解决方法: 下载openssl-1.1.0h.tar  包 [root@localhost ~]# cd openssl-1.1 ...

  3. SDOI2018一轮NOI培训 题目整理

    \(qwq\)首先,这些题对于我而言--类似于\(emmm\)洪水猛兽 \(\mathcal{Day \ \ 1}\) T1 \(\mathcal{\color{red}{Description}}\ ...

  4. Jmeter--常见问题及解决办法

    此文转自微信公众号:自动化性能测试 JMeter常见问题及解决方法 一.录制不到以html结尾的请求 在使用代理服务器录制脚本的时候,可能会出现html结尾的请求录制不到的问题.这是因为浏览器为了提升 ...

  5. Adapter(适配器)模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

  6. Java解析Excel之应用Reflection等技术实现动态读取

    目录树 背景 技术选型 问题分析 技术要点及难点分析 源码分析 测试用例 背景 Tip:因为产品提的需求我都开发完了,进行了项目提测:前天老大走过来说:你用spring-boot开发一个解析Excel ...

  7. 设计一个学生类&班级类

    第一题 设计一个学生类 属性:姓名.学号.年龄.成绩 设计一个班级类要求:实现向班级中添加学生.删除学生.查看学生.按照指定条件排序 属性:班级代号,所有学生 需要使用 calss, __int__, ...

  8. MySQL学习之路(二)——数据类型和操作数据表

    数据类型和操作数据表 2.1 MySQL类型之整型 2.2 MySQL数据类型之浮点型 2.3 日期时间型 DATE 1支持时间:1000年1月1日~9999年12月31日 DATETIME 3 支持 ...

  9. 新增时json类型报错

    新增时出错:如下 实体类中字段类型没有对应上,vue页面中修改跳转页面的路径:使用params...

  10. redis学习指南

    一.redis安装 # 安装最新版 yum install -y epel-release vim atop htop net-tools git wget gcc-c++ yum clean all ...