什么是泛型:泛型就是编写模板代码来适应任意类型。 下面做个简单的例子: java中一个ArrayList数组中能够存放object类型的数组,如果用其转存String类会有两个缺点:
需要强转不方便易出错。 Arraylist的代码 public class ArrayList { //可以看到,在数组中存放的是Object类型,因此可以接收任意类型,但用String类型获取必须强转。 private Object[] array; private int size; public void add(Object e) {...} public void remove(int index) {...} public Object get(int index) {...} }因此,我们可以这样重新创建一个StringArrayList
public class ArrayList { private String[] array; private int size; public void add(Object e) {...} public void remove(int index) {...} public Object get(int index) {...} }但这样又出现了局限性,因为java中类很多,而且还有个人创建的类,如果要为这些类分别创建一个这样的数组类,不能实现。 因此,泛型在这里有了用处: 我们可以使用泛型来创建String类型的list
ArrayList<String> strList = new ArrayList<String>();测试:
strList.add("hello"); // OK String s = strList.get(0); // OK strList.add(new Integer(123)); // compile error! Integer n = strList.get(0); // compile error!可以将ArrayList<T>(用T来表示任意类型)看做是一个模版,我们可以在这模版上添加任何类型。
向上转型:使用ArrayList可以向上转型为List 因为ArrayList实现了List的接口
List<String> list = new ArrayList<String>();但注意,泛型中ArrayList<Integer>和、ArrayList<Number>不能随意转换,因为可能报错。 即T不能变。
如果创建的数组不进行泛型声明,则默认的类型为Object类型。
List list = new ArrayList();泛型接口 除了在ArrayList<T>中使用泛型,也可以在自己编写的类中使用泛型。 例如:可以在Arrays中使用sort()方法对数组进行排序,排序的类型需实现Comparable<T>接口。
// sort import java.util.Arrays; //String类型排序按照首字母的先后顺序 public class Main { public static void main(String[] args) { String[] ss = new String[] { "Orange", "Apple", "Pear" }; Arrays.sort(ss); System.out.println(Arrays.toString(ss)); } } 输出:[Apple, Orange, Pear]因为String类已经继承了泛型接口:Comparable<T> 所以在自己定义的类中,若想使用泛型,该类徐先继承泛型接口。
按照以下格式编写,一般编写较少
public class Pair<T> { private T first; private T last; public Pair(T first, T last) { this.first = first; this.last = last; } public T getFirst() { return first; } public T getLast() { return last; } }定义:
public class Pair<T, K> { private T first; private K last; public Pair(T first, K last) { this.first = first; this.last = last; } public T getFirst() { ... } public K getLast() { ... } }使用:
Pair<String, Integer> p = new Pair<>("test", 123);//这里的new pair<>里可以不写,由编译器添加例子:Map<key,value>。
