写点什么

Java 进阶 | 泛型机制与反射原理

发布于: 2 小时前
Java进阶 | 泛型机制与反射原理

一、泛型的概念

1、基础案例

泛型在 Java 中的应用非常广泛,最常见则是在集合容器中,先看下基础用法:

public class Generic01 {    public static void main(String[] args) {        Map<Integer,String> map = new HashMap<>() ;        map.put(88,"hello") ;        // map.put("99","world") ; 输入编译错误        String value = map.get(88) ;        // Integer value = map.get(88) ; 输出编译错误        System.out.println("value:"+value);    }}1.2.3.4.5.6.7.8.9.10.
复制代码

声明一个 map 类型的容器,并且明确限定 key 和 value 的类型:分别为 Integer,String,这样显然不能体现特别之处,可以对比下面的用法:

Map newMap = new HashMap() ;newMap.put("hello","world");newMap.put(88,99);1.2.3.
复制代码

在不指定类型的情况下,键值对都默认为 Object 类型,这样的容器在使用的时候要时刻注意不同的 key 类型和取出的 value 值类型,并且 value 要做类型转换,相比之下泛型机制就很有必要。

可以看下 Map 接口的定义:

public interface Map<K,V> {    V get(Object key);    V put(K key, V value);}1.2.3.4.
复制代码

在 Map 接口中,<K,V>显然没有指定明确的类型,只是起到类型传递的作用,即 K 是 key 的类型,V 是 value 的类型,在上面的源码中描述的很清楚,结合上面案例,在 Map 对象声明的时候可以明确指定<K,V>的类型,也可以缺省为 Object 类型。

2、泛型描述

泛型即可以理解为把数据类型作为参数,即参数化类型,用来提高代码的安全性,灵活性,避免类型转换;代码简洁明了,同时对于程序的可扩展性起到至关重要的作用。

首先设计一个简单的顶层接口,只定义一个 callBack 方法,和对出入参数的简单逻辑设定,这种设计在 Java 的源码设计中随处可见,例如上面的集合体系:

/** * 基础接口设计 * @param <R> 返参类型 * @param <V> 入参类型 */interface CallBack<R,V> {    /**     * 回调方法:V 方法入参 ,R 方法返回值     */    R callBack (V v) ;}1.2.3.4.5.6.7.8.9.10.11.
复制代码

为了实现具体的业务,再基于顶层接口向下做扩展,这里声明两个扩展接口,作为具体业务类的接口:

复制

/** * 扩展接口设计01 */interface ExtCallBack01<R extends Integer,V extends List<String>>                        extends CallBack<Integer,List<String>> {    @Override    Integer callBack (List<String> list) ;}/** * 扩展接口设计01 */interface ExtCallBack02<R extends Boolean,V extends Map<String,Long>>        extends CallBack<Boolean,Map<String,Long>> {    @Override    Boolean callBack (Map<String,Long> map) ;}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.
复制代码

这样可以通过扩展接口去设计具体的业务类,提高程序的灵活可扩展性:

用户头像

还未添加个人签名 2017.10.10 加入

还未添加个人简介

评论

发布
暂无评论
Java进阶 | 泛型机制与反射原理