Java泛型T,E,K,V,N,?与Object区别和含义

Java泛型是Java 5之后引入的新特性,可以让我们编写更加类型安全的代码。在泛型中,T、E、K、V、N 和 ? 是常见的符号。它们代表的是不同的类型参数。

T

T 是 Java 泛型中最常见的类型,表示任意类型。在定义类或方法时,我们可以使用 T 代替所有可能的类型。例如,下面是一个定义了一个泛型类的例子:

public class Box<T> {
    private T t;
    public void set(T t) {
        this.t = t;
    }
    public T get() {
        return t;
    }
}

在类名后面的尖括号里,我们使用 T 定义了一个类型参数。在类中的方法中可以使用 T 代替任意类型,从而实现了一个通用的操作。

E

E 也是一种泛型类型参数,和 T 类似,它表示任意类型。通常被用作集合的元素类型的占位符。例如,使用 E 定义一个简单的列表:

public class MyList<E> {
    private E[] list;
    public MyList(int size) {
        list = (E[])new Object[size];
    }
    public E get(int index) {
        return list[index];
    }
    public void set(int index, E value) {
        list[index] = value;
    }
}

在上面的例子中,我们使用 E 定义了一个类型参数。在类中的各种方法中使用 E 代替了任意类型,实现了一个通用的操作。

K和V

K 和 V 分别表示 Key 和 Value,通常用于表示 Map 中的键/值类型。例如,定义一个简单的 Map 实现:

public class MyMap<K, V> {
    private List<K> keys = new ArrayList<>();
    private List<V> values = new ArrayList<>();
    public void put(K key, V value) {
        keys.add(key);
        values.add(value);
    }
    public V get(K key) {
        int index = keys.indexOf(key);
        if (index != -1) {
            return values.get(index);
        }
        return null;
    }
}

在上面的例子中,我们使用 K 和 V 定义了两个类型参数,用于表示键和值的类型。在 put 和 get 方法中,可以使用 K 和 V 代替任意类型。

N

N 是一个数字类型参数,在 Java 中没有内置数字类型参数,如果需要支持数字类型参数,就需要使用 N。例如,为一个数组排序:

public class Sorter<N extends Number> {
    private N[] array;
    public Sorter(N[] array) {
        this.array = array;
    }
    public void sort() {
        Arrays.sort(array);
    }
}

在上面的例子中,我们使用 N 定义了数字类型参数。在 sort 方法中,可以使用 N 代替任意数字类型,例如 Integer、Double、Float 等。

?

? 表示未知类型参数,通常用于表示不关心具体类型的情况。例如,打印任意类型的数组:

public class Printer {
    public static void printArray(Object[] array) {
        for (Object element : array) {
            System.out.println(element);
        }
    }
}

在上面的例子中,我们使用 Object 类型作为数组的元素类型。在 printArray 方法中,可以使用 ? 代替任意类型,例如 Integer、Double、String 等。使用 ? 表示不关心具体类型,这让代码变得更加灵活。

Object

Object 是一个基本类型,表示所有 Java 对象类型的超类。和泛型 T、E、K、V、N 和 ? 不同,它不能代表任何类型参数。在需要处理具体类型的情况下,我们通常使用 Object。

下面是使用 Object 的例子:

public class Box {
    private Object object;
    public void set(Object object) {
        this.object = object;
    }
    public Object get() {
        return object;
    }
}

在上面的例子中,我们使用 Object 作为 Box 类的成员变量类型。在 set 方法中,可以设置任意类型的值;在 get 方法中,可以返回 Object 类型的值。使用 Object 让代码能够处理任意类型的数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java泛型T,E,K,V,N,?与Object区别和含义 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 浅谈servlet3异步原理与实践

    浅谈servlet3异步原理与实践 什么是Servlet3异步 Servlet3.0规范中增加了异步处理的功能,使Servlet容器的性能可以进一步提升。Servlet3.0之前,servlet都是由线程来处理的,每次请求都需要创建一个线程,处理完请求后才会销毁这个线程。如果请求量很大,反复创建销毁线程的过程会给服务器造成很大负担。 而异步Servlet能够…

    Java 2023年5月20日
    00
  • MyBatis如何使用(二)

    下面是“MyBatis如何使用(二)”的完整攻略: MyBatis如何使用(二) 在上一篇文章中,我们学习了MyBatis的基本概念和使用方法。本篇文章将进一步介绍如何使用MyBatis进行数据操作。 数据库连接配置 在使用MyBatis进行数据操作前,我们需要先进行数据库连接配置。在MyBatis中,数据库连接信息是通过配置文件来管理的。下面是一个示例的配…

    Java 2023年6月1日
    00
  • Java中文件的读写方法之IO流详解

    Java中文件的读写方法之IO流详解 什么是Java IO流 Java IO(Input/Output)流是一种用于处理输入输出的机制,它为我们提供了读取和写入数据的方法,可从不同来源读取数据,例如网络、文件等,也可以将数据写入到不同的位置,例如文件、网络等。Java IO流分为输入流和输出流,其中,输入流用于读取数据,输出流用于写入数据。 Java IO流…

    Java 2023年5月19日
    00
  • Java超详细教你写一个学籍管理系统案例

    Java超详细教你写一个学籍管理系统案例攻略 本文将介绍如何用Java语言编写一个学籍管理系统,包括如何设计数据库、如何实现登录、管理学生信息等功能。 设计数据库 首先,我们需要设计数据库表格。在本案例中,我们需要设计两个表格:学生表和用户表。学生表存储学生的基本信息,如学号、姓名、性别、年龄、所在班级、联系方式等。用户表存储管理员的用户名和密码。 实际上,…

    Java 2023年5月24日
    00
  • AngularJS HTML编译器介绍

    AngularJS HTML编译器是AngularJS的核心模块之一,用于将HTML模板编译成可操作的JavaScript对象,并连接到作用域上。在本文中,我们将详细讲解AngularJS HTML编译器的使用和原理,并结合示例进行说明。 一、AngularJS HTML编译器介绍 1.1 HTML编译器的作用 AngularJS的HTML编译器主要作用是将…

    Java 2023年6月15日
    00
  • java多媒体文件编码 处理工具类代码实例

    Java多媒体文件编码处理工具类 本文将详细讲解如何使用Java多媒体文件编码处理工具类来编码、解码、转换和编辑多媒体文件。 什么是Java多媒体文件编码处理工具类? Java多媒体文件编码处理工具类是一个Java库,提供了编码、解码、转换和编辑多媒体文件的功能。它支持音频和视频文件的处理,其中包括: 音频格式:MP3、WAV、AIFF、AU、FLAC、OG…

    Java 2023年5月19日
    00
  • Java中判断对象是否相等的equals()方法使用教程

    当我们在Java中处理对象时,判断两个对象是否相等(equality)是一个很普遍的问题,《Java中判断对象是否相等的equals()方法使用教程》提供了一个详细的攻略,帮助我们更好地理解在Java中使用equals()方法。 一、如何判断对象是否相等 在Java中,判断对象是否相等并不能简单地使用“==”运算符。在Java中,对象实际上是存储在内存中的,…

    Java 2023年5月26日
    00
  • volatile关键字的作用是什么?

    首先,volatile 是 C 和 C++ 中的一个关键字,用于告诉编译器该变量是可以被其他线程修改的,从而避免了编译器进行一些针对该变量的优化,确保了内存中的正确性。 使用 volatile 的作用是使变量的访问和修改都在主内存中进行,而不是在寄存器或缓存中进行,以实现不同线程之间的可见性和互通性。例如,在多线程程序中,如果一个线程修改了一个变量的值,而另…

    Java 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部