iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java泛型
  • 476
分享到

Java泛型

java数据结构 2023-08-22 19:08:16 476人浏览 八月长安
摘要

Java泛型 🧳1. 泛型类的定义🧳1.1 语法1.2 简单示例1.3 加入静态内部类的示例1.4 加入继承或实现的示例1.5泛型的上界1.5.1复杂举例1.6泛型的下界 🌂2.

大家好,我是晓星航。今天为大家带来的是 Java泛型 相关内容的讲解!😀

🧳1. 泛型类的定义🧳

一般的类和方法,只能使用具体的类型:要么是基本的类型,要么是自定义类型。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的舒服就会很大。----来源《Java编程思想》对泛型的介绍。

泛型实在jdk1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

1.1 语法

class 泛型类名称<类型形参列表> {// 这里可以使用类型参数}class ClassName<T1, T2, ..., Tn> {        }
class 泛型类名称<类型形参列表> extends 继承类 {// 这里可以使用类型参数}class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {// 可以只使用部分类型参数        }

了解: 【规范】类型形参一般使用一个大写字母表示,常用的名称有:

  • E 表示 Element
  • K 表示 Key
  • V 表示 Value
  • N 表示 Number
  • T 表示 Type
  • S, U, V 等等 - 第二、第三、第四个类型

不能实例化泛型类型的数组

    public T[] objects = new T[10];//ERROR 1、不能实例化泛型类型的数组

1.2 简单示例

定义一个泛型类顺序表

// 演示泛型目的,没有做错误处理和扩容public class MyArrayList<E> {    private E[] array;    private int size;    public MyArrayList() {// 泛型类型无法直接创建数组,具体的见下面的注意事项        array = (E[])new Object[16];        size = 0;    }    // 尾插    public void add(E e) {        array[size++] = e;    }    // 尾删    public E remove() {        E element = array[size - 1];        array[size - 1] = null; // 将容器置空,保证对象被正确释放        size--;        return element;    }}

1.3 加入静态内部类的示例

定义一个泛型类链表

public class MyLinkedList<E> {    public static class node<E> {        private E value;        private Node<E> next;        private Node(E e) {            value = e;            next = null;        }    }    private Node<E> head;    private int size;    public MyLinkedList() {        head = null;        size = 0;    }    // 头插    public void pushFront(E e) {        Node<E> node = new Node<>(e);        node.next = head;        head = node;        size++;    }    // 尾插    public void pushBack(E e) {        if (size == 0) {            pushFront(e);            return;        }        Node<E> cur = head;        while (cur.next != null) {            cur = cur.next;        }        cur.next = new Node<E>(e);        size++;    }}

1.4 加入继承或实现的示例

定义一个泛型类顺序表

public interface MyList<E> {    // 尾插    void add(E e);    // 尾删    E remove();}
public class MyArrayList<E> implements MyList<E> {// TODO: 未完成}

1.5泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

语法

class 泛型类名称<类型形参 extends 类型边界> {...}

上述的类型边界就是我们泛型的上界

示例

public class MyArray<E extends Number> {...}

只接受 Number 的子类型作为 E 的类型实参

MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型
error: type argument String is not within bounds of type-variable E    MyArrayList<String> l2;        ^where E is a type-variable:    E extends Number declared in class MyArrayList

了解: 没有指定类型边界 E,可以视为 E extends Object

不指定边界就默认为Object

1.5.1复杂举例

public class MyArray<E extends Comparable<E>> {...}

E必须是实现了Comparable接口的

1.6泛型的下界

泛型没有下界!!!

🌂2. 泛型类的使用🌂

2.1 语法

泛型类<类型实参> 变量名; // 定义一个泛型类引用new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象

2.2 示例

MyArrayList<String> list = new MyArrayList<String>();

2.3 类型推导(Type Inference)

当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写

MyArrayList<String> list = new MyArrayList<>(); // 可以推导出实例化需要的类型实参为 String

☂️3. 裸类型(Raw Type) (了解)☂️

3.1 说明

裸类型是一个泛型类但没有带着类型实参,例如 MyArrayList 就是一个裸类型

MyArrayList list = new MyArrayList();

**注意:**我们不要自己去使用裸类型,裸类型是为了兼容老版本的 api 保留的机制

下面的类型擦除部分,我们也会讲到编译器是如何使用裸类型的。

3.2 未检查错误

MyArrayList<String> list = new MyArrayList(); // 自己永远不要这么用

上述代码,会产生编译警告

Note: Example.java uses unchecked or unsafe operations.Note: Recompile with -Xlint:unchecked for details.

可以使用 @SuppressWarnings 注解进行警告压制

@SuppressWarnings("unchecked")

🧵4. 泛型类的定义-类型边界🧵

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

4.1 语法

class 泛型类名称<类型形参 extends 类型边界> {...}

4.2 示例

public class MyArrayList<E extends Number> {...}

只接受 Number 的子类型作为 E 的类型实参

MyArrayList<Integer> l1; // 正常,因为 Integer 是 Number 的子类型MyArrayList<String> l2; // 编译错误,因为 String 不是 Number 的子类型error: type argument String is not within bounds of type-variable E        MyArrayList<String> l2;        ^where E is a type-variable:        E extends Number declared in class MyArrayList

了解: 没有指定类型边界 E,可以视为 E extends Object

4.3 复杂一点的示例

定义一个泛型类搜索树

public class BSTree<K extends Comparable<K>, V> {...}

传入的 K 必须是 Comparable 的,并且是可以和另一个 K 类型做比较的,后边的 K 是对类型参数的使用了

🧶5. 类型擦除🧶

我们之前已经讲过,泛型是作用在编译期间的一种机制,实际上运行期间是没有这么多类的,那运行期间是什么类型呢?这里就是类型擦除在做的事情。

class MyArrayList<E> {// E 会被擦除为 Object}class MyArrayList<E extends Comparable<E>> {// E 被擦除为 Comprable}

总结: 即类型擦除主要看其类型边界而定

了解: 编译器在类型擦除阶段在做什么?

  1. 将类型变量用擦除后的类型替换,即 Object 或者 Comparable
  2. 加入必要的类型转换语句
  3. 加入必要的 bridge method 保证多态的正确性

👓6. 泛型类的使用-通配符(Wildcards)👓

? 用于在泛型的使用,即为通配符

6.1通配符解决什么问题

**通配符是用来解决泛型无法协变的问题的,**协变指的就是如果 StudentPerson 的子类,那么 List 也应该是 List 的子类。但是泛型是不支持这样的父子类关系的。

泛型 T 是确定的类型,一旦你传了我就定下来了,而通配符则更为灵活或者说是不确定,更多的是用于扩充参数的范围。

或者我们可以这么理解:泛型T就像是个变量,等着你将来传一个具体的类型,而通配符则是一种规定规定你能传哪些参数。

class Alg3 {    public static <T> void print1(ArrayList<T> list) {        for (T x: list) {            System.out.println(x);        }    }    public static void print2(ArrayList<?> list) {        for (Object x: list) {            System.out.println(x);        }    }}

print1是泛型T来接受,他可以确定你传过来的是泛型T类型。

但是print2使用的是Object来接受,他不能确定你传过来的?是什么类型,所以他选择了使用万能类型Object来接受。

示例

package www.bit.java.test;class Message<T> {    private T message ;    public T getMessage() {        return message;    }    public void setMessage(T message) {        this.message = message;    }}public class TestDemo {    public static void main(String[] args) {        Message<String> message = new Message() ;        message.setMessage("庐山风景真美");        fun(message);    }    public static void fun(Message<String> temp){        System.out.println(temp.getMessage());    }}

以上程序会带来新的问题,如果现在泛型的类型设置的不是String,而是Integer.

public class TestDemo {    public static void main(String[] args) {        Message<Integer> message = new Message() ;        message.setMessage(99);        fun(message); // 出现错误,只能接收String    }    public static void fun(Message<String> temp){        System.out.println(temp.getMessage());    }}

我们需要的解决方案:可以接收所有的泛型类型,但是又不能够让用户随意修改。这种情况就需要使用通配符"?"来处理

范例:使用通配符

public class TestDemo {    public static void main(String[] args) {        Message<Integer> message = new Message() ;        message.setMessage(55);        fun(message);    }    // 此时使用通配符"?"描述的是它可以接收任意类型,但是由于不确定类型,所以无法修改    public static void fun(Message<?> temp){//temp.setMessage(100); 无法修改!        System.out.println(temp.getMessage());    }}

在"?"的基础上又产生了两个子通配符:

? extends 类:设置泛型上限

? super 类:设置泛型下限

6.2 通配符-上界

语法

只能调用传入参数的子类,不允许调用他们的父类

<? extends 上界><? extends Number>//可以传入的实参类型是Number或者Number的子类

示例

// 可以传入类型实参是 Number 子类的任意类型的 MyArrayList 因为这里的? 继承了Number。public static void printAll(MyArrayList<? extends Number> list) {...}// 以下调用都是正确的printAll(new MyArrayList<Integer>());printAll(new MyArrayList<Double>());printAll(new MyArrayList<Number>());// 以下调用是编译错误的printAll(new MyArrayList<String>());printAll(new MyArrayList<Object>());

此时的list可以引用的子类对象很多,编译器无法确定你具体的类型的。 编译器为了安全起见,此时只允许你进行读取。

上述传入的是Number,调用Integer、Double和Number是可以的,但是调用String和Object是不可以的。

注意: 需要区分 泛型使用中的通配符上界 和 泛型定义中的类型上界

通配符的上界,不能进行写入数据,只能进行读取数据。

6.3 通配符-下界

语法

<? super 下界><? super Integer>//代表 可以传入的实参的类型是Integer或者Integer的父类类型

示例

// 可以传入类型实参是 Integer 父类的任意类型的 MyArrayListpublic static void printAll(MyArrayList<? super Integer> list) {        ...        }// 以下调用都是正确的        printAll(new MyArrayList<Integer>());        printAll(new MyArrayList<Number>());        printAll(new MyArrayList<Object>());// 以下调用是编译错误的        printAll(new MyArrayList<String>());        printAll(new MyArrayList<Double>());

假如我们引用Person,我们引用的对象肯定是Person或者Person的父类的集合,我们能够确定此时存储的元素的最小粒度比Person小的都可以。但是,你读取的时候,你知道是读取到的哪个子类吗?

添加元素时,只要添加的时Person或者Person的子类就可以。

通配符的下界,不能进行读取数据,只能写入数据。

为什么

Person person = arrayList1.get(0);

//Student student = arrayList1.get(0);

注:Student是Person的子类

不可以取出arrayList的元素?

答:因为存放的时候可以通过多态来存放Person的子类,但是取出的时候,只能取出Person或者Person的父类,不能向下引用子类

🥼7. 泛型中的父子类型(重要)🥼

public class MyArrayList<E> { ... }// MyArrayList 不是 MyArrayList 的父类型// MyArrayList 也不是 MyArrayList 的父类型// 需要使用通配符来确定父子类型// MyArrayList 是 MyArrayList 的父类型// MyArrayList 是 MyArrayList 的父类型 

理论上来说:Object是所有类的父类

为什么上述代码的Object不是Number的父类呢,因为编译完成后我们的类型都被擦除了

🦺8. 泛型方法🦺

8.1 定义语法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }

8.2 示例

一般的泛型方法需要new对象,new完对象之后才可以使用我们的Alg方法

class Alg<T extends Comparable<T>> {    public T findMax(T[] array) {        T max = array[0];        for (int i = 0; i < array.length; i++) {            if (max.compareTo(array[i]) < 0) {                max = array[i];            }        }        return max;    }}public class TestDemo {    public static void main(String[] args) {        Alg<Integer> alg = new Alg<>();        Integer[] array = {1,2,3,4,7,5,6,9,100,97,123};        System.out.println(alg.findMax(array));        Alg<String> alg1 = new Alg<>();        String[] array1 = {"abc","xxhljq","hello"};        System.out.println(alg1.findMax(array1));    }

加入了static之后的泛型方法变为了静态的泛型方法,不需要new对象,直接就可以调用Alg2的方法。

class Alg2 {    public static <T extends Comparable<T>>T findMax(T[] array) {        T max = array[0];        for (int i = 0; i < array.length; i++) {            if (max.compareTo(array[i]) < 0) {                max = array[i];            }        }        return max;    }}public class TestDemo {    public static void main(String[] args) {        Integer[] array = {1,2,3,4,7,5,6,9,100,97,123};        //System.out.println(Alg2.findMax(array));  不写我们的Alg2方法也会自己推导出array的类型是Integer        System.out.println(Alg2.<Integer>findMax(array));        String[] array1 = {"abc","xxhljq","hello"};        //System.out.println(Alg2.findMax(array1));  不写我们的Alg2方法也会自己推导出array的类型是String        System.out.println(Alg2.<String>findMax(array1));    }}

8.3 使用示例-可以类型推导

Integer[] a = { ... };        swap(a, 0, 9);        String[] b = { ... };        swap(b, 0, 9);

8.4 使用示例-不使用类型推导

Integer[] a = { ... };        Util.<Integer>swap(a, 0, 9);        String[] b = { ... };        Util.<String>swap(b, 0, 9);

👔9. 泛型的限制👔

  1. 泛型类型参数不支持基本数据类型
  2. 无法实例化泛型类型的对象
  3. 无法使用泛型类型声明静态的属性
  4. 无法使用 instanceof 判断带类型参数的泛型类型
  5. 无法创建泛型类数组
  6. 无法 create、catch、throw 一个泛型类异常(异常不支持泛型)
  7. 泛型类型不是形参一部分,无法重载

👕10. 完整定义一份泛型类支持的搜索树(不使用 Comparator)👕

import java.util.*;public class BSTree<K extends Comparable<K>, V> {    private static class Entry<K, V> {        private K key;        private V value;        private Entry<K, V> left = null;        private Entry<K, V> right = null;        private Entry(K key, V value) {            this.key = key;            this.value = value;        }        @Override        public String toString() {            return String.fORMat("{%s=%s}", key, value);        }    }    private Entry<K, V> root = null;    public V get(K key) {        Entry<K, V> cur = root;        while (cur != null) {            int r = key.compareTo(cur.key);            if (r == 0) {                return cur.value;            } else if (r < 0) {                cur = cur.left;            } else {                cur = cur.right;            }        }        return null;    }    public V put(K key, V value) {        if (root == null) {            root = new Entry<>(key, value);            return null;        }        Entry<K, V> parent = null;        Entry<K, V> cur = root;        while (cur != null) {            int r = key.compareTo(cur.key);            if (r == 0) {                V oldValue = cur.value;                cur.value = value;                return oldValue;            } else if (r < 0) {                parent = cur;                cur = cur.left;            } else {                parent = cur;                cur = cur.right;            }        }        Entry<K, V> entry = new Entry<>(key, value);        if (key.compareTo(parent.key) < 0) {            parent.left = entry;        } else {            parent.right = entry;        }        return null;    }    public V remove(K key) {        Entry<K, V> parent = null;        Entry<K, V> cur = root;        while (cur != null) {            int r = key.compareTo(cur.key);            if (r == 0) {                V oldValue = cur.value;                removeEntry(parent, cur);                return oldValue;            } else if (r < 0) {                parent = cur;                cur = cur.left;            } else {                parent = cur;                cur = cur.right;            }        }        return null;    }    private void removeEntry(Entry<K, V> parent, Entry<K, V> cur) {        if (cur.left == null) {            if (cur == root) {                root = cur.right;            } else if (cur == parent.left) {                parent.left = cur.right;            } else {                parent.right = cur.right;            }        } else if (cur.right == null) {            if (cur == root) {                root = cur.left;            } else if (cur == parent.left) {                parent.left = cur.left;            } else {                parent.right = cur.left;            }        } else {            Entry<K, V> gParent = cur;            Entry<K, V> Goat = cur.left;            while (goat.right != null) {                gParent = goat;                goat = goat.right;            }            cur.key = goat.key;            cur.value = goat.value;            if (goat == gParent.left) {                gParent.left = goat.left;            } else {                gParent.right = goat.left;            }        }    }    public static interface Function<T> {        void apply(T entry);    }    public static <K, V> void preOrderTraversal(Entry<K, V> node, Function<Entry<K, V>>            func) {        if (node != null) {            func.apply(node);            preOrderTraversal(node.left, func);            preOrderTraversal(node.right, func);        }    }    public static <K, V> void inOrderTraversal(Entry<K, V> node, Function<Entry<K, V>>            func) {        if (node != null) {            inOrderTraversal(node.left, func);            func.apply(node);            inOrderTraversal(node.right, func);        }    }    public void print() {        System.out.println("前序遍历: ");        preOrderTraversal(root, (n) -> {            System.out.print(n.key + " ");        });        System.out.println();        System.out.println("中序遍历: ");        inOrderTraversal(root, (n) -> {            System.out.print(n.key + " ");        });        System.out.println();    }    public static void main(String[] args) {        BSTree<Integer, String> tree = new BSTree<>();        int count = 0;        Random random = new Random(20190915);        for (int i = 0; i < 20; i++) {            int key = random.nextInt(200);            String value = String.format("Value of %d", key);            if (tree.put(key, value) == null) {                count++;            }        }        System.out.println("一共插入 " + count + " 个结点");        tree.print();    }}

感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

来源地址:https://blog.csdn.net/xinhang10/article/details/130513086

--结束END--

本文标题: Java泛型

本文链接: https://www.lsjlt.com/news/377999.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java泛型
    Java泛型 🧳1. 泛型类的定义🧳1.1 语法1.2 简单示例1.3 加入静态内部类的示例1.4 加入继承或实现的示例1.5泛型的上界1.5.1复杂举例1.6泛型的下界 🌂2. ...
    99+
    2023-08-22
    java 数据结构
  • java 泛型
    概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。 泛型,就是类型参数。 一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。 那么类型参数理解呢? 顾名思义,就是将原来的具体的类型...
    99+
    2023-08-30
    java
  • 一篇文章带你了解java泛型--泛型类,泛型方法,泛型接口
    目录Java 泛型Java 泛型是什么泛型类泛型类的格式泛型类举例泛型方法泛型方法的格式泛型方法举例泛型接口泛型接口的格式泛型接口举例泛型接口实现类:测试接口类:打印结果:总结Jav...
    99+
    2024-04-02
  • JAVA泛型浅析
    本文主要列举了在使用Java泛型时应该注意的问题。Java泛型是Java5的一个重要特性,它和自动装箱、变长参数等新特性一起,提升了Java代码的健壮性和易用性,但SUN本身过分强调向前的兼容性,也引入了不少问题和麻烦。[@more@]JA...
    99+
    2023-06-03
  • Java泛型类型擦除
    目录1. 什么是类型擦除2. 什么是原始类型3. 类型擦除带来的问题和解决方法3.1 和多态的冲突3.2 不能使用instanceof3.3 在静态类和静态方法中的问题1. 什么是类...
    99+
    2024-04-02
  • Java中的泛型
    目录1. 什么是泛型2. 为什么需要泛型3. 如何使用泛型3.1 泛型使用3.2 自定义泛型类3.2.1 Java 源码中泛型的定义3.2.2 自定义泛型类实例13.2.3 自定义泛...
    99+
    2024-04-02
  • Java 泛型详解(超详细的java泛型方法解析)
    目录2. 什么是泛型3. 使用泛型的好处4. 泛型的使用4.1 泛型类4.2 泛型方法4.3 泛型接口5. 泛型通配符5.1 通配符基本使用5.2 通配符高级使用6. 总结1. 为什...
    99+
    2024-04-02
  • Java泛型的解析
    这期内容当中小编将会给大家带来有关Java泛型的解析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、泛型简介1.1 泛型的概念 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是...
    99+
    2023-06-15
  • Java获取泛型类型信息
    根据使用泛型位置的不同可以分为:声明侧泛型、使用侧泛型。 声明侧的泛型信息被记录在Class文件的Constant pool中以Signature的形式保存。而使用侧的泛型信息并没有保存。 声明侧泛型 声明侧泛型包括: 泛型类,或泛型接口的...
    99+
    2023-09-18
    java 开发语言
  • 详解Java中的泛型
    目录一.什么是泛型二.泛型类的使用2.1泛型类的定义2.2泛型类的数组使用三.泛型的上界四.泛型的方法五.泛型与集合一.什么是泛型 当我们不确定数据类型时,我们可以暂时使用一个字母 ...
    99+
    2023-05-19
    Java泛型 Java泛型类
  • Java泛型实例分析
    这篇文章主要介绍“Java泛型实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java泛型实例分析”文章能帮助大家解决问题。首先,我们来看看泛型Java的经典用法:import java.ut...
    99+
    2023-06-03
  • Java基础泛型详情
    目录一、泛型二、泛型类三、泛型方法四、泛型接口五、类型通配符<>六、可变参数一、泛型 概述: 泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译...
    99+
    2024-04-02
  • 如何掌握Java泛型
    本篇内容介绍了“如何掌握Java泛型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 为什么要用泛型设想一个场景,我们希望用Java...
    99+
    2023-06-15
  • Java泛型怎么应用
    本篇内容主要讲解“Java泛型怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java泛型怎么应用”吧!一、什么是泛型Java 泛型(generics)是 JDK 5 中引入的一个新特性,...
    99+
    2023-06-27
  • java泛型如何实现
    在Java中,泛型是通过使用尖括号来实现的。在类或方法的声明中,可以使用泛型来指定一个或多个类型参数。 在类的声明中,可以在类名后面...
    99+
    2023-10-27
    java
  • 重新理解Java泛型
    这篇文章的目的在于介绍Java泛型,使大家对Java泛型的各个方面有一个最终的,清晰的,准确的理解,同时也为下一篇《重新理解Java反射》打下基础。简介泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用。本文我们将从...
    99+
    2023-05-30
    java 泛型的理解 ava
  • java中什么是泛型
    本篇文章给大家分享的是有关java中什么是泛型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程...
    99+
    2023-06-14
  • Java 泛型考古 泛型擦除 包装类详细解析
    目录一. 什么是泛型二. 为什么要有泛型 ?示例三、泛型考古四、泛型擦除五、包装类六、装箱拆箱一. 什么是泛型 泛型(generic type)其本质是将类型参数化,也就是说所操作的...
    99+
    2024-04-02
  • Java中怎么擦除泛型类型
    Java中怎么擦除泛型类型,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采...
    99+
    2023-06-20
  • java泛型方法指什么
    这篇文章主要讲解了“java泛型方法指什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java泛型方法指什么”吧!目录什么是泛型泛型的使用规则泛型应用实例1、什么是泛型泛型,就是允许在定义...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作