泛型
泛型即“参数化类型。”就是将声明时需要指定的类型也定义为参数。在具体使用时,再给定具体的类型。这样不用创建新类型,就可以由泛型来实现参数的多类型。
泛型有三种,分为泛型接口,泛型类,和泛型方法。
泛型接口
// 定义泛型接口
public interface Generator<T>{
public T next();
}
//当一个类实现此接口时,如果不传入类型实参(即给定 T 的具体类型),则这个类也必须定义为泛型类。
class FunctionGenerator<T> implements Generator<T>{
@override
public T next(){
return null;
}
}
//当实现泛型接口的类传入类型实参时,原接口中声明的方法的类型形参T也被确定了,在实现此方法时,必须替换为相应的类型实参。
class FunctionGenerator implements Generator<String>{
@override
public String next(){
String s="aaa";
return s;
}
}
泛型类
泛型类的定义形式如下:
// An highlighted block
class 类名<类型形参:就像变量名,可以随便写>{
private 类型形参 变量名;
}
//具体例子
class A<T>{
//泛型变量
private T bianliang;
//泛型构造方法
public A(T t){
this.bianliang=t;
}
//泛型方法(此为泛型类中的方法,泛型为类的声明中给定)
public T getBianliang(){
return bianliang;
}
}
在定义泛型类时如果传入了类型实参,则相应的类中定义的属性,方法,构造函数中就不能使用类型形参(但可以自定义泛型方法)。相反地,如果定义了泛型类且并未指定类型,其中的方法与构造函数可以不传入类型实参,这样在使用时就可以传入任意类型的参数
// An highlighted block
public class A<T>{
public T a;
Integer f(){
return null;
}
public A(T t){
this.a=t;
System.out.println(a);
}
public static void main(String[] args) {
A a1= new A("abcc");
A a2= new A(1);
A a3= new A(2.2);
A a4= new A(true);
}
}
//运行结果
abcc
1
2.2
true
泛型方法
泛型方法不等同于泛型类中的方法。一个方法是否是泛型方法只取决于它自身的定义,泛型方法定义如下:
// 是否为泛型方法只取决于访问修饰符(public)与返回值类型(void)之间的<T>,如果这个<T>存在,即为泛型方法。
public <T> void method(){
}
//当确定为泛型方法,即在方法中可以任意使用此类型形参。
//此方法可以返回泛型类型,以及使用泛型参数。
public <T> T method(T t){
}
泛型方法的具体情况比较复杂,我会单独写一篇笔记进行总结。