泛型类
public class GenClass<T>{
private T obj;
public GenClass(T obj){
this.obj = obj;
}
public T getObj(){
return obj;
}
public void setObj(T obj){
this.obj = obj;
}
}
// 1. 泛型的类型参数可以是泛型类
// 2. 泛型类可以同时设定泛型类
// 3. 泛型类可以继承泛型类
// 4. 泛型类可以实现泛型接口
限制泛型可用类型
- 在定义泛型类别时,默认在实例化泛型类的时候,可以使用任何类型,但是如果想要使用泛型类时,只能用某个特定的类或者其子类型才能实例化该类型时,可以在定义类型时,使用extends 关键字指定这个类型必须继承某个类,或实现某个接口。
- 当没有制定泛型继承类型或接口,默认使用T extends Object,所以默认情况下任何类型都可以作为参数传入。
类型通配声明
- 同一泛型类,如果实例化时给定的实际类型不同,则这些实例类型是比兼容的,不能相互赋值。
Generic<Boolean> f1 = new Generic<Boolean> ();
Generic<Integer> f2 = new Generic<Integer>();
f1 = f2; // 编译报错
Generic<Object> f = f2;//f1 与f 类型并不兼容,发生编译错误
f = f2;//f2与f 同样类型不兼容,编译报错
- 泛型类实例间的不兼容性会带来使用的不便。我们可以使用泛型通配符(?)声明泛型类变量就可以解决这个问题。
-
泛型通配的方式
- “?” 代表任意一个类型
Generic<Boolean> b1 = new Generic<Boolean>();
Generic<?> b = b1;- 和限制泛型的上限类似,同样使用extends关键字限制通配符使用的上限:
Generic<Dog> g = new Generic<Dog>();
Generic<? extends Animal> g1 = g;- 还可以使用super关键字将通配符匹配类型限定为某个类型 及其父类
Generic<Animal> g = Generic<Animal>();
Generic<? super Dog> f= g;
泛型方法
-
不仅类可以声明泛型,类中的方法也可以声明仅用于自身的泛型,这种方法叫做泛型方法。其定义格式为:
访问修饰符 <泛型列表> 返回类型 方法名 (参数列表){
实现代码
} -
泛型列表中声明泛型,可用于该方法返回类型声明、参数类型声明 和方法代码中的局部变量的类型声明
提示: 是否拥有泛型方法,与其所在的类是否泛型没有关系.要定义泛型方法,只需将泛型参数列表至于返回值之前.
- 什么时候使用泛型方法而不是泛型类呢?
- 添加类型约束之作用于一个方法的多个参数之间 、而不涉及到其它方法时,使用泛型方法限制泛型可用类型。
- 施加类型约束的方法称为静态方法,只能将其定义为泛型方法,因为静态方法不能使用其所在类型参数。