泛型类的使用

什么是泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。
泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

泛型的引出

因为JAVA是强类型语言,定义变量时必须定义类型

  1. 我们以前学过的数组,只能存放指定类型的元素,
  2. 例如:int[] array = new int[10]; String[] strs = newString[10];
  3. 所有类的父类,默认为Object类。数组是否可以创建为Object?
    首先我们要知道Object是JAVA中的最高参数统一化,能接收所有类型;有了包装类的自动拆装箱之后
    Object还可以接收基本类型(自动装箱)
    在这里插入图片描述
    上面代码看着没问题(因为X,Y类型一致)但是大家要知道我们让用户输入会发成各种奇怪的问题,
    看下面代码当X,Y类型不一致会出现啥问题
    在这里插入图片描述
    由于Object可以接受所有的类型但是Object换成其他类型都需要强行转换
    调用getX和getY方法时,要根据其具体类型,将Objec强转为具体的子类(隐藏风险,这个风险发生在运行阶段)需要一种新的机制,在定义类的时候,成员变量可以接收多种类型,但是在产生具体对象时明确类型,当有不同的类型设置时,编译阶段就能发现错误
    JDK1.5引入的泛型机制。所谓的泛型,就是我们在定义类或方法时,没有明确参数的类型,而是在使用该类时,明确类型。不需要进行类型强转,编译阶段就会在语法阶段检查类型是否匹配的机制。类型的编译阶段守门员,不会让类型不匹配的问题进入到运行阶段!

泛型的使用

class 泛型类名称<类型形参> {
类型参数,成员变量名称
}
在这里插入图片描述
泛型类可以在定义时不明确成员变量类型,但是在产生对象是必须明确类型

泛型对象的产生

泛型类<明确类型>引用名称=new 泛型类名称<>();

   Point<Integer>p=new Point<>();
   //此时产生的是integer类型的Point对象此时的x和y就会被定义成整型

在这里插入图片描述
可以在编译阶段就检查设置的类型是否满足要求
在这里插入图片描述

泛型类使用多个类型参数语法

泛型类名称<类型参数1,类型参数2,…>{
类型参数1 变量x;
类型参数2 变量y;
//…以此类推
}

public class Point<T,E> {
    private T x;
    private E y;

产生多类型参数对象

泛型类<明确类型1,明确类型2>引用名称=new 泛型类名称<>();
注意(明确类型1,明确类型2可以相同)

     Point<Integer,Integer>p=new Point<>();
    // 明确类型1,明确类型2相同
   Point<Integer,String>p=new Point<>();
   //明确类型1,明确类型2不同

1类名后的 代表占位符,表示当前类是一个泛型类
了解:
一般使用多个大写的字母来定义类型参数=>一般指代任何类均可

E=>一般代表元素Element和T意义差不多,也有使用E来指代异常的意思身份证号,姓名

K和V一般搭配使用,描述一个键值对的对象,K=》key的意思,不重复的键值V =》value的意思,可以重复

泛型定义方法语法

泛型不仅可以定义,还可以定义方法
权限修饰符<类型参数>方法返回值类型 方法名称(参数类型 形参名称){

}

  public <E>void fun(E e){
        System.out.println("泛型方法");
        System.out.println("e");
    }

注意
泛型方法以自己的类型参数为准,为了区分和泛型类的类型参数,一般若泛型类中存在泛型方法,使用不同的类型参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是Java中一种强大的特性,它允许我们在编写类或方法时使用参数,从而增加代码的灵活性和重用性。 要在Java类中使用,可以在类名后面使用尖括号<>来定义类参数。例如,我们可以创建一个类来表示一个箱子,可以存放不同类的物品: ```java public class Box<T> { private T item; public void setItem(T item) { this.item = item; } public T getItem() { return item; } } ``` 在上面的例子中,`T`是一个类参数,它表示箱子可以存放的物品的类。通过使用参数,我们可以在实例化`Box`类时指定具体的类。 下面是如何使用类的示例: ```java Box<String> stringBox = new Box<>(); stringBox.setItem("Hello"); String item = stringBox.getItem(); // 返回 "Hello" Box<Integer> integerBox = new Box<>(); integerBox.setItem(42); int item = integerBox.getItem(); // 返回 42 ``` 通过在实例化`Box`类时指定不同的类参数,我们可以创建不同类的箱子,并且在编译时进行类检查,以确保类的安全性。 除了类,我们还可以在方法中使用。这样可以使方法更加通用,适用于不同的数据类。例如: ```java public class Utils { public static <T> void printArray(T[] array) { for (T item : array) { System.out.println(item); } } } ``` 在上面的例子中,`<T>`表示这是一个方法,并且`T`是一个类参数。我们可以使用这个方法打印任意类的数组: ```java String[] stringArray = {"Hello", "World"}; Utils.printArray(stringArray); Integer[] intArray = {1, 2, 3}; Utils.printArray(intArray); ``` 通过使用,我们可以编写更加通用和灵活的代码,提高代码的可复用性和类安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值