泛型的基本概念
- 泛型就是将类型作为一个参数来指定,有了泛型后类型不再是不可变的,可以由泛型参数来指定
- 泛型是JDK5.0中一个最重要的特征,
- 泛型可以让我们不使用强制类型转化和运行时最小地抛出ClassCaseException的可能
- 泛型标识符
- E(K,V)表示集合,K键类型,V值类型
- T,U,S表示任意类型
限制泛型的类型
- public class MyGeneric<T> {}
- 表示T继承Object,相当于,<T extends Object>{}
- public class MyGeneric<T extends List>{}
- 表示T只能是List子接口或者子类
- public class MyGeneric<T extends List&Map>{}
- 表示T只能是List子接口或者子类或者Map子接口或者子类
- ArrayList<Object> = new Array<String>
- 表面看起来String可以放入到Object,其实不行
- 因为Object列表中可以放入任何对象,而String只能放入字符串
- public class MyGeneric<?> {}
- ?是通配符,表示可以接受任意具体类型
- 泛型通配符只能用于引用声明,不可以创建对象
- ArrayList<?> al= new ArrayList<?>
- 泛型引用不可以调用使用了泛型参数的方法
- public class MyGeneric<T super List>{}
- 表示T只能是List父类或者父接口
<T extends List>和<? extends List>的区别
- <T extends List>是定义类时就确定了T的类型是List的子接口或者子类
- <? extends List>是定义类时可以不确定T的类型,而是在使用的时候确定引用可以指向什么类型
泛型案例
- package com.itlwc;
- public class MyGeneric<T1,T2,T> {
- private T1 foo1;
- private T2 foo2;
- private T[] fooArray;
- public T1 getFoo1() {
- return foo1;
- }
- public void setFoo1(T1 foo1) {
- this.foo1 = foo1;
- }
- public T2 getFoo2() {
- return foo2;
- }
- public void setFoo2(T2 foo2) {
- this.foo2 = foo2;
- }
- public T[] getFooArray() {
- return fooArray;
- }
- public void setFooArray(T[] ArrfooArrayay) {
- this.fooArray = ArrfooArrayay;
- }
- public static void main(String[] args) {
- MyGeneric<Boolean,Integer,String> foo = new MyGeneric<Boolean,Integer,String>();
- String[] str = { "a", "b", "c" };
- foo.setFoo1(true);
- foo.setFoo2(123);
- foo.setFooArray(str);
- }
- }
方法中使用泛型
- package com.itlwc;
- public class Test {
- //自定义泛型方法
- public static <T> T getLast(T[] a){
- //返回最后一个元素
- return a[a.length-1];
- }
- public static void main(String[] args) {
- String[] str = {"a","b","c"};
- System.out.println("数组最后一个元素为: "+Test.<String>getLast(str));
- Integer[] i = {1,2,3};
- System.out.println("数组最后一个元素为: "+Test.<Integer>getLast(i));
- }
- }
- /*
- 打印结果:
- 数组最后一个元素为: c
- 数组最后一个元素为: 3
- */