java高级特性之--泛型

时间:2022-09-20 19:23:02

泛型类

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;

泛型方法

  • 不仅类可以声明泛型,类中的方法也可以声明仅用于自身的泛型,这种方法叫做泛型方法。其定义格式为:

    访问修饰符 <泛型列表> 返回类型 方法名 (参数列表){
    实现代码
    }
  • 泛型列表中声明泛型,可用于该方法返回类型声明、参数类型声明 和方法代码中的局部变量的类型声明

    提示: 是否拥有泛型方法,与其所在的类是否泛型没有关系.要定义泛型方法,只需将泛型参数列表至于返回值之前.

  • 什么时候使用泛型方法而不是泛型类呢?
    • 添加类型约束之作用于一个方法的多个参数之间 、而不涉及到其它方法时,使用泛型方法限制泛型可用类型。
    • 施加类型约束的方法称为静态方法,只能将其定义为泛型方法,因为静态方法不能使用其所在类型参数。