首页 > 编程语言 >Java泛型

Java泛型

时间:2024-08-28 08:55:03浏览次数:9  
标签:Box Java item 类型 参数 泛型 public

Java泛型是Java语言的一个重要特性,它允许你在编译时指定类型参数,从而编写更加灵活和可重用的代码。

Java泛型的概念

Java泛型是在JDK 5.0中引入的,它允许你在声明类、接口和方法时使用类型参数。类型参数可以是你定义的任何标识符,通常使用大写字母如 E, T, K, V等表示。使用泛型的好处包括:

1. 类型安全:编译器会在编译期检查类型安全问题,避免了运行时可能出现的ClassCastException。
2. 代码复用性:通过泛型,你可以编写一次性的代码来处理多种不同的数据类型。
3. 清晰的类型信息:使用泛型可以让代码更具可读性,因为类型信息更加明显。

泛型的基本使用

类型参数

类型参数在声明时使用尖括号<>表示。例如,定义一个泛型类:

public class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

这里的T是一个类型参数,代表“类型”。

创建泛型类的对象

创建泛型类的对象时,你需要指定具体的类型:

Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
String item = stringBox.getItem(); // 编译器检查类型安全

泛型方法

你也可以在方法级别使用泛型:

public class Utility {
    public static <T> void swap(T[] array, int i, int j) {
        T temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

调用该方法时同样需要指定类型:

Integer[] numbers = {1, 2, 3};
Utility.swap(numbers, 0, 2); // 编译器检查类型安全

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

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

泛型类

泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。

和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

实例

如下实例演示了我们如何定义一个泛型类:

public class Box<T> {
   
  private T t;
 
  public void add(T t) {
    this.t = t;
  }
 
  public T get() {
    return t;
  }
 
  public static void main(String[] args) {
    Box<Integer> integerBox = new Box<Integer>();
    Box<String> stringBox = new Box<String>();
 
    integerBox.add(new Integer(10));
    stringBox.add(new String("菜鸟教程"));
 
    System.out.printf("整型值为 :%d\n\n", integerBox.get());
    System.out.printf("字符串为 :%s\n", stringBox.get());
  }
}

泛型接口

接口也可以声明为泛型接口:

public interface List<T> {
    void add(T element);
    T get(int index);
    int size();
}

泛型的限制

1. 原始类型:在某些情况下,你可能需要使用未指定类型的泛型类,这称为原始类型。例如,List而不是List<String>。原始类型失去了泛型带来的好处。
2. 通配符:为了增加灵活性,Java允许使用通配符?来代替具体的类型参数。例如:

 List<?> list; // 可以接受任何类型的List

3. 类型限定:可以使用extends关键字来限定类型参数必须继承自某个类或实现某个接口:

 public class SomeList<T extends Comparable<T>> {
       // ...
   }

4. 类型通配符的上限和下限:还可以使用通配符加上extends或super关键字来指定类型参数的上限或下限:

  public void method(List<? extends Number> list) { // 只能接受Number及其子类
       // ...
   }

   public void method(List<? super Integer> list) { // 可以接受Integer或其父类
       // ...
   }

示例下面是一个简单的例子,演示了如何使用泛型类和方法:

public class Main {
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>();
        stringBox.setItem("Hello World");
        String content = stringBox.getItem();
        System.out.println(content);

        swap(new Integer[]{1, 2}, 0, 1); // 交换数组中的两个元素
    }

    public static <T> void swap(T[] array, int i, int j) {
        T temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

这个例子中定义了一个泛型类Box和一个泛型方法swap。在主方法中,我们创建了一个Box<String>实例,并调用了swap方法来交换整数数组中的元素。

标签:Box,Java,item,类型,参数,泛型,public
From: https://blog.csdn.net/b123321888/article/details/141624248

相关文章

  • TypeScript 泛型:编写可复用代码的利器
    ......
  • [Java并发]Semaphore
    Semaphore是一种同步辅助工具,翻译过来就是信号量,用来实现流量控制,它可以控制同一时间内对资源的访问次数.无论是Synchroniezd还是ReentrantLock,一次都只允许一个线程访问一个资源,但是Semaphore可以指定多个线程同时访问某一个资源.Semaphore有一个构造函数,可以传入一个int型......
  • Java元注解介绍
    Java四种元注解相关介绍概述注解从Java1.5引入以来,不断地简化我们编写代码的流程,逐渐的也成为了我们必学的一项技术。我们学习了各种注解,学习了他们的用法,学习了他们的限制,是否想过他们的组成呢,下面我将我对元注解的理解分享给大家。元注解是用来修饰注解的注解,在java.lang.ann......
  • Java数据结构栏目总结
     目录数组与稀疏数组队列:自己用数组模拟Queue环形队列,取模【取余】实现.单链表(LinkList)双向链表(Next、Pre)单向环形链表线性结构数组与稀疏数组稀疏数组,很多0值,可用于压缩特点:共n+1行3列,n为不同值的个数(0除外)第一行:数组的行数、列数、不同值的个数第二行:行......
  • Java毕设项目II基于Spring Boot的医药管理系统的设计与实现
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言"在当今医疗信息化快速发展的背景下,设计......
  • 7.java面向对象
    面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么…...面对过程适合处理一些较为简单的问题。面向对象思想物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。......
  • Java 使用QQ邮箱的接收&发送功能,入门级教程
    进入qq邮箱主页面,点击账号下滑找到POP3...如果没有开启,需要开启,开启后,点击管理服务然后点击生成授权码按照步骤执行完成后,会给你需要的授权码1.拿到授权码后,导入相关依赖,和yml相关配置,注意修改配置文件的信息<dependency><groupId>org.apache.commons</......
  • Java10 集合
    集合集合集合接口等级:Collection:单例集合接口,将数据一个一个存储,存储的是值。ArrayList类:泛型集合Linkedlist集合:Vector集合:Stack集合:Vetor的子类Set接口:存储是无序的,且集合中的元素不可重复Hashset集合:Linkedhashset:是有序不重复的set集合,继承于hashsetTreeset:排序,去......
  • JAVA基础之二-面向对象简述
    java基础之二-面向对象简述一、概述如果有机会多接触几种语言,对于程序员多少是有好处的,至少有助于理解代码的运行真谛。高级语言有很多是面向对象的,因为面向对象的优点是显而易见的。这里比较知名的有rust,java,c++,c#但也有很多语言是面向过程的,鼎鼎有名有C,还有现在大家不......
  • 《JavaEE进阶》----1.<JavaEE进阶可以学到什么>
    本篇博客会讲到一、JavaEE进阶学习内容:1.框架的学习:Spring、SpringBoot、SpringMVC、MyBatis2.大项目实践3.源码阅读二、JavaEE简介B/S架构web开发流程web前端开发(了解)web后端开发(重点)三、什么是框架四、学习编程思维方式(重点:学习建议)学完JavaEE你的收获会持续......