泛型(泛型是什么意思)

  本篇文章为你整理了泛型(泛型是什么意思)的详细内容,包含有泛型编程 泛型是什么意思 泛型 java 泛型擦除 泛型,希望能帮助你了解 泛型。

  泛型,即 “参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?

  顾名思义,就是通过泛型指定的不同类型来控制形参限制。在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

  常见的泛型变量

  E:元素(Element),多用于 java 集合框架
 

  K:关键字(Key)
 

  N:数字(Number)
 

  T:类型(Type)
 

  V:值(Value)

  为什么用泛型

  提高可读性
 

  使 ClassCastException 这种错误在编译期就检测出来
 

  适用于多种数据类型执行相同的代码(代码复用)

  举个例子:

  

public class Add {

 

   //普通方法实现

   private static int add(int a, int b) {

   System.out.println(a + "+" + b + "=" + (a + b));

   return a + b;

   private static float add(float a, float b) {

   System.out.println(a + "+" + b + "=" + (a + b));

   return a + b;

   private static double add(double a, double b) {

   System.out.println(a + "+" + b + "=" + (a + b));

   return a + b;

   // 泛型方法实现

   private static T extends Number double add(T a, T b) {

   System.out.println(a + "+" + b + "=" + (a.doubleValue() + b.doubleValue()));

   return a.doubleValue() + b.doubleValue();

   public static void main(String[] args) {

   Add.add(1, 2);

   Add.add(1f, 2f);

   Add.add(1d, 2d);

   System.out.println("--------------------------");

   // 以下三个都是调用泛型方法

   // 此时其实是用一个泛型方法就实现了上面三个重载方法的功能。

   Add.add(Integer.valueOf(1), Integer.valueOf(2));

   Add.add(Float.valueOf(1), Float.valueOf(2));

   Add.add(Double.valueOf(1), Double.valueOf(2));

  

 

  泛型的使用方法

  由我们指定想要传入泛型类中的类型,把泛型定义在类上,用户使用该类的时候,才把类型明确下来,比如:定义一个万能的实体数据暂存工具类。

  泛型类在初始化时就把类型确定了

  

package com.nasus.generic.how;

 

  public class EntityTool T {

   private T entity;

   public T getEntity() {

   return entity;

   public void setEntity(T entity) {

   this.entity = entity;

   public static void main(String[] args) {

   // 创建对象并指定元素类型

   EntityTool String stringTool = new EntityTool ();

   stringTool.setEntity("一个优秀的废人");

   String s = stringTool.getEntity();

   System.out.println(s);

   // 创建对象并指定元素类型

   EntityTool Integer integerTool = new EntityTool ();

   // 此时,如果这里传入的还是 String 类型,那就会在编译期报错

   integerTool.setEntity(10);

   int i = integerTool.getEntity();

   System.out.println(i);

  

 

  泛型方法在调用时才确定最终类型
 

  若有返回值,返回值不需要强转

  

package com.nasus.generic.how;

 

  public class Show {

   public static T T show(T t) {

   System.out.println(t);

   return t;

   public static void main(String[] args) {

   // 返回值不用强转,传进去是什么,返回就是什么

   String s = show("一个优秀的废人");

   int num1 = show(666);

   double num2 = show(666.666);

   System.out.println("------------------------");

   System.out.println(s);

   System.out.println(num1);

   System.out.println(num2);

  

 

  当实现类不明确泛型接口的类型参数变量时,实现类也必须定义类型参数变量

  

public interface Show T {

 

   void show(T t);

  public class ShowImpl T implements Show T {

   @Override

   public void show(T t) {

   System.out.println(t);

   public static void main(String[] args) {

   ShowImpl String stringShow = new ShowImpl ();

   stringShow.show("一个优秀的废人");

  

 

  明确泛型接口的类型参数变量

  

public class ShowImpl2 implements Show String {

 

   @Override

   public void show(String s) {

   System.out.println("一个优秀的废人");

  

 

  限定泛型类型变量

  限定泛型类型上限

  指定了泛型类的父类声明类

  在类中使用:
 

  类名 泛型标识 extends 类 {}

  

// 用在类上

 

  public class Show T extends Number {

   private T show(T t){

   System.out.println(t);

   return t;

   public static void main(String[] args) {

   // 初始化时指定类型

   Show Integer show = new Show ();

   show.show(6666666);

   // 报错,该类只接受继承于 Number 的泛型参数

   // Show String stringShow = new Show ();

  

 

  在方法中使用
 

  定义对象:类名 泛型标识 extends 类 对象名称

  

public class Info T {

 

   // 定义泛型变量

   private T var;

   public void setVar(T var) {

   this.var = var;

   public T getVar() {

   return this.var;

   public String toString() {

   return this.var.toString();

  
// 用在方法上,只能接收 Number 及其子类

   public static void showInfo(Info ? extends Number t) {

   System.out.print(t);

   public static void main(String args[]) {

   Info Integer i1 = new Info ();

   Info Float i2 = new Info ();

   i1.setVar(666666666);

   i2.setVar(666666.66f);

   showInfo(i1);

   showInfo(i2);

  

 

  限定泛型类型下限

  定义对象:类名 泛型标识 extends 类 对象名称

  与指定上限相反,指定下限定很简单,就是相当于指定了泛型类的子类。

  

public class ShowInfo {

 

   // 只接受 String 的父类

   public static void showInfo(Info ? super String t) {

   System.out.println(t);

   public static void main(String args[]) {

   Info String stringInfo = new Info ();

   Info Object objectInfo = new Info ();

   stringInfo.setVar("一个优秀的废人");

   objectInfo.setVar(new Object());

   showInfo(stringInfo);

   showInfo(objectInfo);

  

 

  通配符类型

   ? extends Parent 指定了泛型类型的上限

   ? super Child 指定了泛型类型的下届

   ? 指定了没有限制的泛型类型

  泛型的使用规范

  1、不能实例化泛型类
 

  2、静态变量或方法不能引用泛型类型变量,但是静态泛型方法是可以的
 

  3、基本类型无法作为泛型类型
 

  4、无法使用 instanceof 关键字或 == 判断泛型类的类型
 

  5、泛型类的原生类型与所传递的泛型无关,无论传递什么类型,原生类是一样的
 

  6、泛型数组可以声明但无法实例化
 

  7、泛型类不能继承 Exception 或者 Throwable
 

  8、不能捕获泛型类型限定的异常但可以将泛型限定的异常抛出

  以上就是泛型(泛型是什么意思)的详细内容,想要了解更多 泛型的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: