说⼀说你对泛型的理解

1.是什么

        泛型(Generics)是Java 5中引入的一个特性,它提供了编译时类型安全检查的机制,允许在编码阶段指定集合的元素类型或者方法的参数类型。使用泛型可以增强程序的可读性和安全性,避免在运行时出现类型转换异常。


1. 泛型的定义

泛型是通过类型参数来实现的,这些类型参数在类、接口或方法的定义中使用一对尖括号(<>)指定。


2. 泛型的优点

  • 类型安全:泛型可以保证在编译时期就能检查出非法的类型转换,而不是在运行时抛出ClassCastException
  • 消除强制类型转换:使用泛型后,可以减少代码中的类型转换操作,使得代码更加简洁。
  • 代码复用:通过泛型,可以编写适用于多种数据类型的类或方法。

3. 泛型的使用示例

泛型类
public class Box<T> {
    private T t; // T stands for "Type"
    
    public void set(T t) {
        this.t = t;
    }
    
    public T get() {
        return t;
    }
}

在这个例子中,Box是一个泛型类,它有一个类型参数T。这个T可以在实例化Box类的时候指定。

泛型方法
public class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) &&
               p1.getValue().equals(p2.getValue());
    }
}

public class Pair<K, V> {
    private K key;
    private V value;
    
    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }
    
    public K getKey() { return key; }
    public V getValue() { return value; }
}

这里Util类中的compare方法是一个泛型方法,它接受两个Pair类型的参数,并比较它们的键和值。


4. 泛型的类型限定

有时候,你可能希望限制泛型可以接受的类型。这可以通过类型限定来实现。

public class Plate<T extends Fruit> {
    private T item;
    
    public Plate(T item) {
        this.item = item;
    }
    
    public void set(T item) {
        this.item = item;
    }
    
    public T get() {
        return item;
    }
}

在这个例子中,Plate类只能接受Fruit类或其子类的实例。


5. 泛型的通配符

泛型的通配符?用于表示未知类型,主要有三种使用方式:

  • <?> 无限定通配符
  • <? extends T> 上限通配符
  • <? super T> 下限通配符
public class Fruit {}
public class Apple extends Fruit {}

public class Test {
    public static void main(String[] args) {
        List<Apple> apples = new ArrayList<>();
        List<Fruit> fruits = new ArrayList<>();
        
        // 使用上限通配符
        fruits.add(new Fruit());
        apples.add(new Apple());
        fruits = apples; // 编译错误,因为List<Apple>不是List<Fruit>的子类型
        fruits = new ArrayList<Fruit>(); // 正确
        
        // 使用下限通配符
        List<? super Apple> list = new ArrayList<Fruit>();
        list.add(new Apple()); // 正确
        // list.add(new Fruit()); // 编译错误,因为Fruit不是Apple的父类
    }
}

泛型是Java语言中一个强大而灵活的特性,合理使用泛型可以使代码更加健壮和易于维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值