java泛型学习篇(二)
1 自定义泛型类
1.1 基本语法
Class 类型 < T , R , M . . . > {
}
1.2 注意点
1.2.1 属性和方法都是可以使用泛型的
T t;
public T getT ( ) {
return t;
}
public void setT ( T t) {
this . t = t;
}
1.2.2 使用泛型的数组不能再类中初始化
R [ ] rs= new R [ 8 ] ;
1.2.3 静态类和静态方法都是不可以使用泛型的
static T t1;
public static R getOne ( ) {
return r;
}
1.2.4 泛型类的类型是再创建的时候确定的
ArrayList < Employee > arr = new ArrayList < Employee > ( ) ;
1.2.5 如果创建对象,并没有指定泛型对应的数据类型,那么默认就是Object
ArrayList arr = new ArrayList ( ) ;
2 自定义泛型接口
2.1 基本语法
interface 接口名< T , R , M . . . >
2.2 注意点
2.2.1 接口中,静态成员有不能使用泛型
T t= "123" ;
2.2.2 泛型接口的类型,由继承接口和实现接口确定
interface A extends B < String , Double >
2.3 在默认方法中(jdk8及其以后)也是可以使用泛型的
重写的时候替换的
class C implements D < Integer , Double >
2.4 没有指定类型时.默认是Object类型
Class A implements B 写法一等价于 class A implements B<Object,Object> 写法二
//B是接口,里面使用了泛型约束符(T、R、M、E之类的)
//其中A类重写的B接口的方法都会被<Object,Object>替换掉(不会展示泛型标识符)
//虽然这样写不会报错,但是建议写成写法二
3 自定义泛型方法
3.1 基本语法
修饰符 < T , R , E . . . > 返回类型 方法名( 参数列表) {
}
3.2 注意点
3.2.1 泛型方法可以定义在普通类中,也可以定义在泛型类中
a 普通类中
class Teacher {
public < E , T > void say ( E e, T t) {
}
}
b 泛型类中
class Student < T , R > {
public < U , M > void eat ( U u, M m) {
}
}
3.2.2 当泛型方法被调用时,类型会确定
Teacher t= new Teacher ( ) ;
t. say ( "小红" , 123 ) ;
3.3.3 修饰符后没有<T,R>,那么该方法不是泛型方法,而是使用了泛型
public void tell ( T t) {
}
3.3.4 泛型方法可以使用类声明的泛型,也可以使用自己声明的泛型
class Student < T , R > {
public < U > void eat ( T t, U u) {
}
}
4 泛型方法练习
4.1 题目内容
class Apple < T , R , M > {
public < E > void floy ( E e) {
System . out. println ( e. getClass ( ) . getSimpleName ( ) ) ;
}
public Void eat ( U u) { }
public void run ( M m) { }
}
Apple < String , Integer , Double > apple= new Apple < > ( ) ;
apple. fly ( 10 ) ;
apple. fly ( new Dog ( ) ) ;
4.2 题目解答
class Apple < T , R , M > {
public < E > void floy ( E e) {
System . out. println ( e. getClass ( ) . getSimpleName ( ) ) ;
}
public Void eat ( U u) { }
public void run ( M m) { }
}
Apple < String , Integer , Double > apple= new Apple < > ( ) ;
apple. fly ( 10 ) ;
apple. fly ( new Dog ( ) ) ;
5 泛型的继承和通配符
5.1 泛型是不具备继承性的
ArrayList < Object > arr = new ArrayList < String > ( ) ;
5.2 <?>支持任意泛型类型
public static void m1 ( List < ? > c) {
for ( Object object : c) {
System . out. println ( object) ;
}
}
5.3 <? extends A> 支持A类以及A类的子类,规定了泛型的上限
public static void m2 ( List < ? extends AA> c) {
for ( Object object : c) {
System . out. println ( object) ;
}
}
5.4 <? super A> 支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
/ List < ? super AA> 表示下限为AA , AA 和AA 的所有父类都可以接受, 不限于直接父类
public static void printCollection2 ( List < ? super AA> c) {
for ( Object object : c) {
System . out. println ( object) ;
}
}