首页 > 其他分享 >泛型(Generics)

泛型(Generics)

时间:2024-05-14 09:59:27浏览次数:6  
标签:void content 类型 参数 Generics 泛型 public

Java中的泛型(Generics)是JDK 5引入的一种特性,它使得类、接口和方法能够以一种类型参数化的方式进行定义和使用。泛型的主要目的是增强代码的类型安全性和可读性,同时减少类型转换(cast)操作。

泛型的基本概念

泛型允许我们在类、接口和方法中定义和使用参数化类型,即用一个占位符(类型参数)来表示实际类型。在实际使用时,具体类型会替换这些类型参数。

泛型类

定义一个带有类型参数的类:

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

使用泛型类时指定具体类型:

public class Main {
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>();
        stringBox.setContent("Hello");
        String content = stringBox.getContent();
        System.out.println(content);  // 输出: Hello

        Box<Integer> intBox = new Box<>();
        intBox.setContent(123);
        int number = intBox.getContent();
        System.out.println(number);  // 输出: 123
    }
}

泛型接口

定义一个带有类型参数的接口:

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

实现泛型接口时指定具体类型:

public class StringContainer implements Container<String> {
    private List<String> items = new ArrayList<>();

    @Override
    public void add(String item) {
        items.add(item);
    }

    @Override
    public String get(int index) {
        return items.get(index);
    }
}

泛型方法

定义一个带有类型参数的方法:

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

使用泛型方法:

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

        Util.printArray(intArray);  // 输出: 1 2 3 4
        Util.printArray(stringArray);  // 输出: Hello World
    }
}

泛型的高级特性

通配符

Java泛型中的通配符用于表示不确定的类型,可以用在类和方法的参数中。

  1. 无界通配符 (<?>)
    用于表示任意类型。
public static void printList(List<?> list) {
    for (Object elem : list) {
        System.out.println(elem);
    }
}
  1. 有界通配符(上界) (<? extends T>)
    用于表示某个类型的子类型。
public static void printNumbers(List<? extends Number> list) {
    for (Number number : list) {
        System.out.println(number);
    }
}
  1. 有界通配符(下界) (<? super T>)
    用于表示某个类型的父类型。
public static void addNumber(List<? super Integer> list) {
    list.add(1);  // 允许添加Integer或其子类类型的对象
}

泛型类型擦除

在Java中,泛型是在编译时处理的,编译后所有的泛型信息都会被擦除,这个过程被称为类型擦除(Type Erasure)。类型擦除会将泛型类型替换为其限定类型(通常是Object),并插入类型转换以保持类型安全。

例如,以下泛型类:

public class Box<T> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

在编译后,大致会变成:

public class Box {
    private Object content;

    public void setContent(Object content) {
        this.content = content;
    }

    public Object getContent() {
        return content;
    }
}

泛型的限制

由于类型擦除的存在,泛型在Java中有一些限制:

  1. 不能使用基本类型:泛型类型参数不能是基本类型(如intchar等),只能使用包装类型(如IntegerCharacter等)。
  2. 运行时类型查询:在运行时,无法获得泛型类型参数的信息,因此不能使用instanceofgetClass来检查泛型类型。
  3. 静态上下文中不能使用泛型类型参数:泛型类型参数不能用于静态变量、静态方法或静态代码块中。
  4. 不能创建泛型数组:例如new T[10]是不允许的,因为在运行时无法确定类型T

泛型的使用场景

泛型广泛应用于集合框架(如List<T>Map<K, V>等),使得代码更加类型安全,并提高了代码的重用性和可读性。

通过了解和使用Java中的泛型,可以编写更为灵活、安全和可维护的代码。

标签:void,content,类型,参数,Generics,泛型,public
From: https://www.cnblogs.com/zxingduo/p/18190654

相关文章

  • 泛型
    1泛型在类上的引用【案例1】创建类MyData,使用<>就有了泛型publicclassMyData<T>{privateTdata;publicTgetData(){returndata;}publicvoidsetData(Tdata){this.data=data;}}【案例2】使用泛型publicclassTest......
  • C/C++ 泛型 -- 继承与多态
    【1】继承与多态-- 多态在模板中的应用#include<iostream>usingnamespacestd;namespace_nmsp1{//多态//人类classHuman{public:virtualvoideat(){cout<<"人类以吃米饭和面食为主!"<<endl;......
  • go 1.18 泛型
     引用:https://segmentfault.com/a/1190000041634906Go1.18泛型全面讲解:一篇讲清泛型的全部WonderfulSoap 2022-03-31阅读 24 分钟English229 序2022年3月15日,争议非常大但同时也备受期待的泛型终于伴随着Go1.18发布了。可是因为Go对泛型的支......
  • dubbo 泛型调用示例 (dubbo generic call)
     1.背景泛型调用适用于观察者模式,即有很多广泛的消费者,但生产者又不想依赖消费者的client包,比如常见的API开放平台的回调机制; 2.泛型调用要实现泛型调用,几个核心点:泛型入参如何构建泛型服务service如何构建泛型调用结果如何拿到 2.1泛型入参 泛型入参须是Ha......
  • rust trait 关联类型和泛型的区别
    关联类型和泛型虽然在某些方面看起来相似,但它们在Rust中扮演着不同的角色,有着本质的区别。下面我会详细解释关联类型、泛型以及它们在Iteratortrait上的应用,以帮助理解为什么Iteratortrait使用关联类型而非泛型参数来定义。关联类型关联类型是trait的一部分,它允许trait......
  • dotnet 泛型委托 ACTION FUNC
    voidMain(){//泛型委托ACTIONFUNC//3.创建委托实例TestDele<string>testDele=newTestDele<string>(HellowDele);testDele("测试委托");//官方版本的泛型委托(不带返回值)Action<string>action=newAction<string>(HellowDele);......
  • dotnet的Lambda表达式 委托泛型(2) Action Func
    //总结://泛型:把类,方法,属性,字段做到了通用化//反射:操作dll文件的一个帮助类库//特性:就是一个特殊的类自定义标记属性特性他就是AOP的另一种实现方式验证属性//委托:就是多播委托,可以保存一个或者多个方法的信息。可以用来传递方法(把方法当作参数传递)。主要用来实现代码的解......
  • 泛型dotnet
    //什么是泛型List<T>T:表示类型参数,指代任意类型T可以是任意标识//编写代码时使用特殊符号替代位置类型,在实例化或使用/调用时才会进行具体类型的定义//特点:重用代码,保护类型安全性,提高性能//泛型集合<k,v>Dictionary<int,string>directory=newDiction......
  • 面向对象编程和`GP`泛型编程
    面向对象编程和GP泛型编程c++标准库标准库并不是用面向对象的概念设计出来的面向对象的概念关键点:class与class的继承关系虚函数->抽象class或者接口面向对象库复杂的点在于继承关系很复杂OOP(Object-Orientedprogramming)关键概念:class的数据放在类里面......
  • HarmonyOS 项目中泛型的使用
    泛型(Generics)概述泛型是一种编程语言特性,它支持类型参数化,使得定义的类、接口和方法可以适用于多种类型,而不仅仅是固定的一种类型。理解泛型泛型允许在定义接口时,让参数的类型更加灵活,从而使得功能更加强大。简而言之,泛型提供了一种方式,让代码能够适应不同的数据类型,而不需要为......