一、泛型的概念
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.
复制代码
这样可以通过扩展接口去设计具体的业务类,提高程序的灵活可扩展性:
评论