Java泛型

本文深入探讨Java泛型的使用原因及优势,包括增强编译时类型检查、消除强制类型转换需求,以及如何通过泛型实现类型安全且易读的算法。通过具体示例,如Box类的泛型版本,展示如何定义和实例化泛型类型。
为什么使用泛型

在定义类,接口和方法时,泛型能将类型(类和接口)座位参数使用。

泛型相比非泛型的优点
  1. 编译时更强的类型检查
    • Java编译器对泛型代码使用强类型检查,如果代码违反了类型安全则显示错误
  2. 消除强类型转换
// 需要类型转换
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);
// 不需要强制类型转换
List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);
复制代码
  1. 程序员可以实现泛型算法
    • 使用泛型实现泛型算法,作用在不同类型的集合上,可以定制,类型安全且易读
示例Box类
public class Box {
    private Object object;

    public void set(Object object) {
        this.object = object;
    }

    public Object get() {
        return object;
    }
}
复制代码

以上Box类的方法可以接收或返回一个对象(Object),所以只要所用的不是几倍类型的数据,用户就可以随意传递。 编译时,我们无法验证该类是如何使用的,而当代码执行到某处时,可能把一个整型数放到了Box中,并期望从Box中获取整型数,然而代码执行到另一处时可能错误的传递了字符串,从而导致运行时错误。

Box类的泛型版本

一个泛型类的定义格式如下

class name<T1, T2 , ..., Tn>{/* ... */}
复制代码

类名后面用“<>”标示出来的是类型形式参数部分,指明类型形式参数是T1,T2,...,Tn

public class Box<T> {
    private T t;

    public void set(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}
复制代码
泛型类型调用和实例化示例
Box<Integer> integerBox;
Box<Integer> integerBox = new Box<Integer>();
复制代码
多个类型参数
public interface Pair<K, V> {
    public K getKey();

    public V getValue();
}

public class OrderedPair<K, V> implements Pair<K, V> {
    private K key;
    private V value;

    public OrderedPair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() {
        return key;
    }

    public V getValue() {
        return value;
    }
}

// 创建实例
Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8);
// Java 编译器可以从声明OrderedPair<String, Integer>中推断出K,V的类型,所以可以写为
Pair<String, Integer> p1 = new OrderedPair<>("Even", 8);
复制代码
参数化类型
Pair<String, Box<Integer>> p = new OrderedPair<>("Even", new Box<Integer>(...));
复制代码

《Java语言导学》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值