Java中泛型的详细介绍

这篇具有很好参考价值的文章主要介绍了Java中泛型的详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言:

        Java语言中的泛型是一种强大的特性,它允许我们在编写代码时指定类、接口和方法的参数类型。通过使用泛型,我们可以提高代码的重用性、可读性和安全性。在本博客中,我们将详细介绍Java中泛型的知识。

一、泛型的基本概念

        泛型是Java 5中引入的一个新特性。它的核心思想是参数化类型,即允许在创建类、接口和方法时使用参数来代替具体的类型。这样一来,使用泛型的代码可以适应不同的数据类型,提高代码的灵活性。

二、泛型类与泛型接口

1、定义泛型类

        在泛型类中,我们可以使用泛型来代替具体的类型。例如,我们可以创建一个泛型类Box<T>,其中T表示类型参数,可以是任意合法的Java类型。定义泛型类的语法如下:

public class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

在使用泛型类时,我们可以通过实例化时指定类型参数的方式创建对象:

Box<Integer> box = new Box<>();
box.setValue(10);
Integer value = box.getValue();

通过这种方式,我们可以使用Box类来存储不同类型的对象,而无需创建多个不同的类。

2、定义泛型接口

与泛型类类似,我们也可以定义泛型接口。例如,我们可以创建一个泛型接口List<T>,其中T表示类型参数。定义泛型接口的语法如下:

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

在实现泛型接口时,我们可以指定具体的类型参数:

public class ArrayList<T> implements List<T> {
    // 省略实现
}

三、泛型方法

        除了泛型类和泛型接口,Java还支持泛型方法。我们可以在方法声明中使用类型参数,从而使该方法可以接受不同的参数类型。定义泛型方法的语法如下:

public <T> void printArray(T[] array) {
    for (T element : array) {
        System.out.println(element);
    }
}

在调用泛型方法时,编译器会根据参数的类型推断出相应的类型参数:

Integer[] numbers = {1, 2, 3, 4, 5};
printArray(numbers);

String[] names = {"Alice", "Bob", "Charlie"};
printArray(names);

四、通配符

在使用泛型时,有时我们需要限制类型参数的范围。Java提供了通配符(Wildcard)来实现这个目的。通配符分为无界通配符"?“和有界通配符”?"。

1、无界通配符(Unbounded Wildcard)

无界通配符表示可以是任意类型,使用"?"表示。例如,List<?>表示一个不确定类型的列表。无界通配符通常用于处理一些与类型无关的操作。

2、有界通配符(Bounded Wildcard)

有界通配符用来限制类型参数的范围,可以是上界(Upper Bounded)或下界(Lower Bounded)。例如,List<? extends Number>表示一个元素为任意Number类型或其子类的列表。有界通配符通常用于处理一些与特定类型相关的操作。

五、泛型类型的类型擦除

在编译期间,Java对泛型做了类型擦除。也就是说,泛型类型的参数信息在运行时是不可用的。这意味着无法在运行时获取泛型类型的具体参数。

六、泛型的优点与缺点

1、优点

  • 提高代码的重用性:通过泛型,我们可以编写与特定类型无关的通用代码,从而提高代码的重用性。
  • 增强代码的可读性:使用泛型可以使代码更加清晰和易读,因为类型参数提供了对代码的更好的描述。
  • 提高代码的安全性:泛型可以在编译时捕获一些类型错误,从而减少在运行时出现类型转换错误的可能性。
  • 避免了强制类型转换:在使用非泛型的旧代码中,我们经常需要进行强制类型转换,而泛型可以避免这种情况的发生。

2、缺点

  • 无法使用基本数据类型作为类型参数:由于类型擦除的原因,无法使用基本数据类型(例如int、char等)作为泛型类型的参数。需要使用对应的包装类(如Integer、Character)来代替。
  • 泛型信息在运行时不可用:在泛型代码中,类型参数的具体信息在运行时是无法获得的,这可能导致一些限制和不便。

七、泛型在集合框架中的应用

        Java集合框架中广泛使用了泛型,使得我们可以更安全和方便地操作和管理数据集合。例如,List<E>、Set<E>和Map<K, V>等接口和类都使用泛型来指定其元素类型或键值对类型。

八、泛型的一些常见用法

1、定义泛型类、接口和方法:通过使用类型参数来实现通用代码和数据结构。

泛型类:

public class Box<T> {
   private T item;

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

   public T getItem() {
      return item;
   }
}

// 使用泛型类
Box<Integer> integerBox = new Box<Integer>();
integerBox.setItem(10);
Integer value = integerBox.getItem(); // 返回 10

Box<String> stringBox = new Box<String>();
stringBox.setItem("Hello");
String message = stringBox.getItem(); // 返回 "Hello"

泛型接口: 

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

// 实现泛型接口
public class ArrayList<T> implements List<T> {
    private T[] array;
    
    public ArrayList() {
        array = (T[]) new Object[10];
    }
    
    @Override
    public void add(T item) {
        // 添加元素到数组
    }
    
    @Override
    public T get(int index) {
        // 获取指定位置的元素
        return array[index];
    }
}

泛型方法: 

public <T> T getMax(T[] array) {
   T max = array[0];
   for (int i = 1; i < array.length; i++) {
      if (array[i].compareTo(max) > 0) {
         max = array[i];
      }
   }
   return max;
}

// 使用泛型方法
Integer[] numbers = {5, 10, 3, 8};
Integer maxNumber = getMax(numbers); // 返回 10

String[] names = {"Alice", "Bob", "Caroline"};
String maxName = getMax(names); // 返回 "Caroline"

2、使用通配符扩展泛型类型的范围:通过使用extends关键字限制类型参数的上界,或使用super关键字限制类型参数的下界。

限制类型参数的上界(extends):

public void processList(List<? extends Number> list) {
   // 可以读取列表中的元素,因为列表中的元素都是Number或Number的子类
   for (Number num : list) {
      // 处理元素
   }
}

List<Integer> integers = new ArrayList<>();
integers.add(10);
integers.add(20);
processList(integers);

List<Double> doubles = new ArrayList<>();
doubles.add(3.14);
doubles.add(2.718);
processList(doubles);

限制类型参数的下界(super): 

public void addNumbers(List<? super Integer> list) {
   // 可以向列表中添加Integer类型的元素,因为列表中的元素类型是Integer或Integer的父类
   list.add(10);
   list.add(20);
}

List<Number> numbers = new ArrayList<>();
numbers.add(3.14);
addNumbers(numbers);

List<Object> objects = new ArrayList<>();
objects.add("Hello");
addNumbers(objects);

3、泛型类型的参数和返回值:可以将泛型类型作为方法的参数和返回值,从而实现对不同类型的支持。

public class GenericExample {
    // 泛型类型参数作为方法参数
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }

    // 泛型类型参数作为方法返回值
    public static <T> T getFirstElement(T[] array) {
        if (array != null && array.length > 0) {
            return array[0];
        } else {
            return null;
        }
    }

    public static void main(String[] args) {
        Integer[] intArray = {1, 2, 3, 4, 5};
        String[] strArray = {"Hello", "World"};

        // 使用泛型类型参数作为方法参数
        printArray(intArray);
        printArray(strArray);

        // 使用泛型类型参数作为方法返回值
        Integer firstInt = getFirstElement(intArray);
        String firstStr = getFirstElement(strArray);

        System.out.println("First integer: " + firstInt);
        System.out.println("First string: " + firstStr);
    }
}

上述示例中的printArray方法使用了泛型类型参数T[]作为参数,可以接受任意类型的数组,并打印数组中的元素。

getFirstElement方法则使用了泛型类型参数T作为返回值,它返回数组的第一个元素。根据传入的具体数组类型,返回对应类型的元素。

main方法中,我们分别使用了IntegerString类型的数组来演示这两个方法的使用。

总结:
        本博客详细介绍了Java中泛型的知识,包括泛型的基本概念、泛型类与泛型接口、泛型方法、通配符、泛型类型的类型擦除等内容。同时,还介绍了泛型在集合框架中的应用以及一些常见的泛型用法。通过学习和应用泛型,我们可以提高代码的重用性、可读性和安全性,使我们的代码更具灵活性和扩展性。文章来源地址https://www.toymoban.com/news/detail-800524.html

到了这里,关于Java中泛型的详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java中泛型和Object类型 初级进阶教程(一)

    在学习的过程中,常常看到某个类或者接口等中使用 ListT, TestT,其中T的作用是什么呢? 1 在类中使用泛型 2 使用多个泛型 3 在类中使用泛型 4 在方法中使用泛型 5 限制泛型类型 6 通配符 (Wildcard) 总结:泛型和Object类型之间的区别 类型安全: 泛型 T : 泛型提供了编译时类型

    2024年02月01日
    浏览(20)
  • 详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

    详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

    目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制(擦除机制) 六.泛型的上界 泛型(Generics)是Java SE 5中引入的一个新特性,可以 使Java中的类和方法具有更广泛的类型范围 。通俗的说,它使得我们可以在定义类和方法时指定

    2024年02月05日
    浏览(11)
  • 【Java】泛型的简单使用

    【Java】泛型的简单使用

    在了解泛型之前我们先了解什么是包装类,在Java中由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean 除了 Integer

    2024年02月04日
    浏览(11)
  • Java语言-----泛型的认识

    Java语言-----泛型的认识

    目录 一.什么是泛型 二.泛型类的使用 2.1泛型类的定义  2.2泛型类的数组使用 三.泛型的上界  四.泛型的方法 五.泛型与集合 😽个人主页: tq02的博客_CSDN博客-C语言,Java领域博主  🌈梦的目标:努力学习,向Java进发,拼搏一切,让自己的未来不会有遗憾。  🎁欢迎各位→点

    2023年04月23日
    浏览(14)
  • Java泛型的继承和通配符

    Java泛型的继承和通配符

    继承 两个容器所容纳的类类型是有子类父类的关系的 但是容器之间没有 反证法: 假设做法成立 list1=list2 list 指向list2的容器实例 list1.add(123)可以成立,明显标注 String 后是不行的 所以 类SuperA是类A的父类,则 GSuperA 与 GA 是并列关系没有子父关系 类SuperA是类A的父类或接口

    2024年01月17日
    浏览(9)
  • 【Java 基础篇】Java类型通配符:解密泛型的神秘面纱

    【Java 基础篇】Java类型通配符:解密泛型的神秘面纱

    在Java中,类型通配符(Type Wildcard)是泛型的重要概念之一。它使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。本文将深入探讨Java类型通配符的用法、语法和最佳实践。 类型通配符是一个用问号 ? 表示的通配符,它可以用于泛型类、方法和通配符边界。类型

    2024年02月07日
    浏览(10)
  • 数据结构(Java实现)-包装类和泛型

    数据结构(Java实现)-包装类和泛型

    包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了 一个包装类型。 基本数据类型和对应的包装类 装箱和拆箱 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中 拆箱操作,将 Integer 对象中

    2024年02月11日
    浏览(13)
  • 【Java--数据结构】提升你的编程段位:泛型入门指南,一看就会!

    【Java--数据结构】提升你的编程段位:泛型入门指南,一看就会!

    泛型是一种编程概念,它允许我们编写可以适用于多种数据类型的代码。通过使用泛型,我们可以在编译时期将具体的 数据类型作为参数 传递给代码,从而实现代码 的复用和灵活性 。 在传统的编程中,我们通常需要为不同的数据类型编写不同的代码,这样会导致代码冗余

    2024年04月26日
    浏览(22)
  • 泛型的通配符

    泛型的通配符

    类型的上界决定了泛型的范围。 我们发现指定了泛型的上界为数值类Number时,传入Boolean类型就会报错。 如果没有指定类型的边界,可以认可 T extends Object,当指定了某个类型为上界,那么只接受某类型本身和子类型作为E的类型实参 我们要实现一个类去找数组的一个的最大值

    2023年04月08日
    浏览(13)
  • 对TS里泛型的理解

    概念 当我们定义一个变量不确定类型的时候有两种解决方式: 使用any(使用any定义时存在的问题:虽然已知道传入值的类型但是无法获取函数返回值的类型;另外也失去了ts类型保护的优势) 使用泛型(泛型指的是在定义函数/接口/类型时, 不预先指定具体的类型 ,而是

    2024年02月09日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包