本文共 2575 字,大约阅读时间需要 8 分钟。
generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods.
泛型能在定义类,接口和方法时将类型(类和接口)作为参数。和方法声明时的形式参数很类似,都是为了在不同的输入时重用相同的代码。不同的是
形式参数输入的是值而泛型是类型。1.编译时更加强的(Stronger)类型检测
java编译器对泛型代码进行强类型检测,一旦检测到代码违反类型安全就发出类型错误。 修复编译错误要比运行错误容易,因为运行错误很难找到问题所在。2.不用类型转换
//没有使用泛型 List list = new ArrayList(); list.add("without generics"); //需要强制类型转换 String s1 = (String) list.get(0); //使用泛型 Listlist2 = new ArrayList (); list2.add("generics"); String s2 = list2.get(0);//不需要转换
3.使程序员能实现适用更加普遍的算法
通过使用泛型,使程序员能实现普遍的算法,算法将是能使用于不同类型的,能自定义的,类型安全的,易读的。
如只写一个排序方法,就能够对整形数组、字符串数组甚至支持排序的任何类型的数组进行排序。
A generic type is a generic class or interface that is parameterized over types.
泛型是一种通用的类或接口,通过类型参数化的。
泛型类以下面的格式定义:
class name{ /* ... */ }
通过Box类的非泛型版和泛型版来学习一下:
非泛型:
//non-generic classpublic class Box { private Object object; public Object getObject() { return object; } public void setObject(Object object) { this.object = object; }}
泛型:
//generic classpublic class Box{ //T表示Type private T t; public T getT() { return t; } public void setT(T t) { this.t = t; }}
类型参数命名规范
按约定的习俗,类型参数的名字都是由一个大写字母构成。E - Element 元素(used extensively by the Java Collections Framework)
K - Key 键 N - Number 数值 T - Type 类型 V - Value 值 S,U,V etc. - 2nd, 3rd, 4th types 第二种,第三种,第四种类型
为了获得泛型类的引用,必须执行泛型类的调用,使用具体的值来代替T,如Integer。
//获得引用BoxintegerBox;//实例化integerBox = new Box ();
泛型类的调用类似于普通的方法调用,只是泛型类传递的是类型参数(type argument)而方法调用传递的是参数(argument)。
泛型类可能有多种类型的参数。如下所示:
public interface Pair{ public K getKey(); public V getValue();}public class OrderedPair implements Pair { private K key; private V value; public OrderedPair(K key,V value){ this.key = key; this.value = value; } @Override public K getKey() { return key; } @Override public V getValue() { return value; }}//实例化Pair p1 = new OrderedPair ("Even", 8);Pair p2 = new OrderedPair ("hello", "world");//Java SE7开始出现的新语法OrderedPair p1 = new OrderedPair<>("Even", 8);OrderedPair p2 = new OrderedPair<>("hello", "world");//参数化的类型OrderedPair > p = new OrderedPair<>("primes", new Box (...));