Java中的泛型机制简介(含义,钻石表达式,自定义泛型))
泛型是java5之后加入的一个重要的特性。本文对泛型进行一个简单的介绍。
从集合的角度分析泛型的含义
泛型本质含义其实是对类型参数化。所谓类型参数化直白一点解释就是,传入的参数的类型不确定,除了形参变量名用标识符来表示,类型名同样用标识符来表示,可以理解为类型也是一个变量。
这里借助集合来对泛型进行理解。
List list1 = new ArrayList();
list1.add("abc");
list1.add(123);
list1.add(true);
这是普通的集合,可以看到,集合中可以添加字符串,整形,布尔型等多种类型(严格来说是所有的类型,包括基本数据类型和引用数据类型)。
那如果想让集合中只存储一种元素呢?
这就使用到了泛型机制。
它的写法是这样的:
List<String> list2 = new ArrayList<String>();
list2.add("acx");
list2.add("1-1-1");
它的写法就是在类名后面写尖括号<>,<>里面写上传入的类型名,构造方法中也是这样。
如果像这样使用了泛型,再在集合中存储其他类型就会报错。
比如:
第三行报错了,因为指定了集合中只能存储字符串类型。
钻石表达式
在Java7之后引入了类型自动推断机制,上面写过的这行代码:
List<String> list2 = new ArrayList<String>();
可以简化成:
List<String> list2 = new ArrayList<>();
构造方法后的<>内省略类型名,因为这个符号长得像钻石,故得名钻石表达式。
自定义泛型
在自己写的 类 或者 接口 里面也可以指定泛型。
这里先看一下Java中List集合源码是如何指定泛型的:
public interface List<E> extends Collection<E> {}
可以看到定义泛型就是在类名或接口名后写上<>,<>里面写一个标识符,标识符可以随便写,List集合后面写的是 E ,E 是element的首字母。
java源代码中经常出现的是:E 和 T
E是Element单词首字母。
T是Type单词首字母。
看一下 List 集合中的add()的源码:
boolean add(E e);
这个方法的意思就是传入一个E类型的对象 e。
所以自定义泛型也按这个套路来就可以了,给一个例子:
public class GenericTest02<T> {
public void whatAmI(T o){
System.out.println("I am a "+o);
}
public static void main(String[] args) {
GenericTest02<Cat> instance = new GenericTest02<>();
instance.whatAmI(new Cat());
}
}
class Cat{
}