- 泛型的定义
泛型是一种特殊类型,它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行,可以把类型当作参数一样传递过来,在传递过来之前我不明确,但是在使用的时候我就明确了。
- 泛型的好处
A:提高了程序的安全性
B:将运行期间遇到的问题转到了编译期
C:省去了类型强转的麻烦
- 泛型类的应用
- 1 泛型类
- 把泛型定义在类上
- 格式: public class 类名<泛型类型 1,…>
- 注意:泛型类型必须是引用类型
- 泛型类的构造器 public 类名(){}; public 类名(){} 是错误的
- 泛型方法
- 把泛型定义在方法上,不管这个时候在其中的类是不是泛型类
- 格式:[访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常
- 1 泛型类
public class DAO {
public <E> E get(int id, E e) {
E result = null;
return result;
}
}
- 泛型接口
- 把泛型定义在接口上面
- 格式: public inferface 接口名<泛型类型1,…>
-
泛型不同的引用不能相互赋值
- 尽管在编译时ArrayList和ArrayList是两种类型,但是,在运行时只有
一个ArrayList被加载到JVM中。
- 尽管在编译时ArrayList和ArrayList是两种类型,但是,在运行时只有
-
如果泛型结构是一个接口或抽象类,则不可创建泛型类的对象。
-
jdk1.7,泛型的简化操作:ArrayList< Fruit > flist = new ArrayList<>();
-
泛型的指定中不能使用基本数据类型,可以使用包装类替换。
-
异常类不能使用泛型的
-
在类/接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在静态方法中不能使用类的泛型。
-
不能使用new E[]。但是可以:E[] elements = (E[])new Object[capacity];
参考:ArrayList源码中声明:Object[] elementData,而非泛型参数类型数组。 -
父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型
- 通配符的使用
-
泛型通配符<?>
-
任意类型,如果没有明确,那么就是Obect以及任意类型的Java类。
注意点
- //注意点1:编译错误:不能用在泛型方法声明上,返回值类型前面<>不能使用? public static <?> void test(ArrayList<?> list){} - //注意点2:编译错误:不能用在泛型类的声明上 class GenericTypeClass<?>{} - class GenericTypeClass<?>{} //注意点3:编译错误:不能用在创建对象上,右边属于创建集合对象 ArrayList<?> list2 = new ArrayList<?>();
-
-
? extends E
- 向下限定,E及其子类
-
? super E
- 向上限定,E及其父类
-
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
public class CollectionDemo {
public static void main(String[] args) {
Collection<?> c1 = new ArrayList<Animal>();
Collection<?> c2 = new ArrayList<Dog>();
Collection<?> c3 = new ArrayList<Cat>();
Collection<?> c4 = new ArrayList<Object>();
Collection<? extends Animal> c5 = new ArrayList<Animal>();
Collection<? extends Animal> c6 = new ArrayList<Dog>();
Collection<? extends Animal> c7 = new ArrayList<Cat>();
// Collection<? extends Animal> c8 = new ArrayList<Object>(); //报错,Animal类或者其子类
Collection<? super Animal> c9 = new ArrayList<Animal>();
// Collection<? super Animal> c10 = new ArrayList<Dog>();
//报错Animal类,或者其父类
// Collection<? super Animal> c11 = new ArrayList<Cat>();
Collection<? super Animal> c12 = new ArrayList<Object>();
}
}