泛型
泛型在类中的使⽤
语法部分
定义: 在类名的后⾯, 紧跟上⼀对尖括号。
class Animal <T> {}
class Dog <T, M> {}
泛型类的使⽤: 声明引⽤、实例化对象、被继承。
// 1. 声明引⽤
Animal<String> animal;
// 2. 实例化对象
Animal<Integer> animal = new Animal<>();
// 3. 被继承
class Dog extends Animal<String> {}
class Dog<T> extends Animal<T> {}
泛型类的特点
在类中定义的泛型, 虽然还不明确是什么类型, 但是在当前类中是可以使⽤的。
在使⽤到这个类的时候, 必须要指定泛型的类型。 如果不指定, 默认是Object。
泛型, 只能在当前的类中使⽤, 不能在其他的类中使⽤, 包括⼦类。
泛型在接⼝中的使⽤
语法部分
泛型接⼝的定义: 在接⼝名字的后⾯, 添加上⼀对尖括号。 在尖括号⾥⾯定义泛型。
interface MyInterface<T> {}
interface MyInterface<T, M> {}
泛型接⼝的使⽤: 实现类实现接⼝、 使⽤接⼝访问接⼝中的静态成员、 被继承。
// 1. 实现类实现接⼝
class MyInterface1Impl implements MyInterface1<Person> {}
// 2. 被继承
interface SubMyInterface extends MyInterface1<String> {}
泛型接⼝的特点
在接⼝中定义的泛型, 虽然还不明确是什么类型, 但是在当前接⼝中是可以使⽤的。
在使⽤到这个接⼝的时候, 必须要指定泛型的类型。 如果不指定, 默认是Object。
泛型, 只能在当前的接⼝中使⽤, 不能在其他的接⼝中使⽤, 包括⼦接⼝。
⼦类使⽤接⼝泛型
这⾥有两种情况:
第⼀种:⼦类与接⼝泛型⼀致,接⼝可以直接使⽤泛型类型
第⼆种:接⼝使⽤泛型,⼦类不⽤,在实现的接⼝位置必须指定⼀个具体的数据类型
泛型在⽅法中的使⽤
语法部分
定义: 泛型⽅法中, 在定义⽅法时,在返回值前⾯通过定义泛型。
public static <T> void test(T t) {
}
在定义处的<>⽤来定义泛型
在调⽤处的<>⽤来使⽤泛型
泛型⽅法的分类
第⼀:⽅法上的泛型与类上的⼀致
第⼆:⽅法上独⽴使⽤泛型
在⽅法中定义的泛型, 虽然还不明确是什么类型, 但是在当前⽅法中是可以使⽤的。
泛型⽅法, 在使⽤的时候, 不能跟类、接⼝似的, ⼿动的设置类型。 泛型⽅法中, 泛型的设置, 在参数中体现。
泛型⽅法, ⼀定需要是有参的。 参数列表中, 必须有泛型类型。
泛型⽅法中的泛型的设置, 是通过在调⽤⽅法的时候, 实参的类型推导出来的。
泛型, 只能在当前的⽅法中使⽤, 不能在其他的⽅法中使⽤。
第三:静态⽅法使⽤泛型
关于java中?的使⽤总结
⽤于?: 这⾥是三⽬运算符⼀部分,前⾯是判断条件,后⾯是两个分⽀结果
⽤于数据库的sql语句 select * from emp where name=? :表示占位符
⽤于泛型,是通配符,表示任意⼀种数据类型.
//这⾥的Object与前⾯的?没有关系
Class<?> class1 = Object.class;
//如果类的泛型使⽤时写成?是可以的.作为返回值时,会默 认成Object类型,但
是作为参数不⾏.
//所以在给对象指定泛型时要写具体类型
Test<?> test = new Test();
//test.run(new Object());
class Test<T>{
T e;
public T run(T a) {
T t = null;
return t;
}
}
限制上限<? extends E>
**定义:**限制的是整个的<>可以取的泛型类型的上限是E,<>中可以取的类型是E及E的⼦类
限制下限<? super E>
定义:限制的是整个的<>可以取的泛型类型的下限是E,<>中可以取的类型是E及E的⽗类
Collections⼯具类
API
Collections.reverseOrder();排序规则取反。