Java 泛型

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。


泛型方法

你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

下面是定义泛型方法的规则:

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

实例:

public class ElementDemo {

    public static void main(String[] args) {

        //<Integer>运行时类型
//使用泛型后,如果实例化是定义的类型与对象传入的类型不一致,就会在编译时期报错。
Test<Integer> t1 = new Test<>();
t1.add(666); Test<String> t2 = new Test<>();
t2.add("cjj");
}
} /**
* "E" 在这里并没有实际意义,你也可以用别的字母代替
* 它的作用就是在实例化Test类的时候,传入什么类型它就调用什么类型
*/
class Test<E>{
public void add(E e) { System.out.println(e);
}
}

注意:

泛型的命名只要符合标识符的命名规则即可
习惯上泛型一般只使用一个大写字母进行命名

<T> type
    <E> element 元素类型
    <K> key
    <V> value
    <R> result/return

泛型向下兼容

<? extends 类/接口>

import java.util.ArrayList;
import java.util.List; public class ElementDemo {
public static void main(String[] args) { //实例化一个Integer类型的数组列表对象,里面存储的数据都是int型数据
List<Integer> in = new ArrayList<>();
in.add(1);
in.add(2);
in.add(3);
in.add(4);
in.add(5);
in.add(6);
//实例化一个Double类型的数组列表对象,里面存储的数据都是Double类型的
List<Double> dos = new ArrayList<>();
dos.add(3.6);
dos.add(4.2);
dos.add(6.8);
dos.add(7.7);
dos.add(0.2); //调用方法
print(in);
print(dos);
} // 写一个新的方法来遍历元素类型是数字的列表
// 元素类型是Number或者是其子类
// ? extends 类/接口 表示传入这个类/接口或者是其子类/子接口对象
// 所能传入的元素的最大类型限定为Number
// 规定了泛型的上限
public static void print(List<? extends Number> list) { //在方法体里面不能再往对象里添加元素,null除外
list.add(null); //打印对象里面的元素
System.out.println(list);
}
}

向上造型规定了泛型的上限,上限的子类都可以向泛型方法传入对象。

泛型向下兼容

<? extends 类/接口>

import java.util.ArrayList;
import java.util.List; public class ElementDemo1 {
public static void main(String[] args) { List<String> str = new ArrayList<>();
str.add(0, "cjj"); print(str);
} // 泛型的下限
// 传入元素类型是String及其父类的列表
// ? super 类/接口 表示传入这个类/接口及其父类/父接口的对象
// 表示传入的最小类型是String
public static void print(List<? super String> list) { //方法体里面可以添加元素
list.add("add"); for(Object o : list){
System.out.println(o);
}
}
}

向上造型规定了泛型的下限,下限的fu类都可以向泛型方法传入对象。

Java 理解泛型的基本含义的更多相关文章

  1. 深入理解Java之泛型

    原文出处: absfree 1. Why ——引入泛型机制的原因 假如我们想要实现一个String数组,并且要求它可以动态改变大小,这时我们都会想到用ArrayList来聚合String对象.然而,过 ...

  2. Java 中泛型的全面解析(转)

    Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...

  3. 跟着刚哥梳理java知识点——泛型(十三)

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: public class GenericTest { public static void main(String[] a ...

  4. C++ Java C#泛型

    泛型概述C#中的泛型C#泛型和java泛型的比较C#泛型和C++模板的比较C#泛型中的约束 泛型概述 Bruce Eckel :您能对泛型做一个快速的介绍么? Anders Hejlsberg : 泛 ...

  5. Android开发之深入理解泛型extends和super的区别

    摘要: 什么是泛型?什么是擦除边界?什么是上界限定或下界限定(子类型限定或超类型限定)?什么是类型安全?泛型extends关和super关键字结合通配符?使用的区别,两种泛型在实际Android开发中 ...

  6. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  7. 十:Java之泛型

    [定义] 一.泛型的定义主要有下面两种: 在程序编码中一些包括类型參数的类型,也就是说泛型的參数仅仅能够代表类.不能代表个别对象.(这是当今较常见的定义) 在程序编码中一些包括參数的类.其參数能够代表 ...

  8. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  9. [转] Java 的泛型擦除和运行时泛型信息获取

    原文链接 https://my.oschina.net/lifany/blog/875769 前言 现在很多程序员都会在简历中写上精通 Java.但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌 ...

随机推荐

  1. HDU 4370 0 or 1(转化为最短路)题解

    思路:虽然是最短路专题里的,但也很难想到是最短路,如果能通过这些关系想到图论可能会有些思路.我们把X数组看做邻接矩阵,那么三个条件就转化为了:1.1的出度为1:2.n的入度为1:3.2~n-1的出度等 ...

  2. POJ 1122 FDNY to the Rescue!(最短路+路径输出)

    http://poj.org/problem?id=1122 题意:给出地图并且给出终点和多个起点,输出从各个起点到终点的路径和时间. 思路: 因为有多个起点,所以这里反向建图,这样就相当于把终点变成 ...

  3. bin log、redo log、undo log和MVVC

    logs innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过 ...

  4. 最全android Demo

    1.BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefreshLayout/tree/Beauti ...

  5. Python在七牛云平台的应用(一)

    七牛云:(引用百度的介绍)七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化PaaS服务.围绕富媒体场景,七牛先后推出了对象存储,融合CDN加速,数据通用处理,内容反垃圾服务,以及直 ...

  6. bzoj-4887-dp+矩阵快速幂

    4887: [Tjoi2017]可乐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 247  Solved: 170[Submit][Status][D ...

  7. MySQL根据表字段生成C#Model语句

    USE INFORMATION_SCHEMA;SELECT CONCAT('/// <summary>\r\n/// ',COLUMN_COMMENT,'\r\n/// </summ ...

  8. DOM之概述

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. C#如何弹出输入框

    在C#中,进行windows窗体应用程序编程的时候,经常需要弹出输入框,输入密码,输入文本之类的.然而,C#中没有直接弹出输入框的语句,MessageBox只能显示一段消息而不能输入.我们需要调用Mi ...

  10. C# Seal用法

    C# Seal用法 sealed的中文意思是密封,故名思义,就是由它修饰的类或方法将不能被继承或是重写. sealed关键字的作用:     在类声明中使用sealed可防止其它类继承此类:在方法声明 ...