一、泛型含义
参数多态性是指方法针对多种类型时具有同样的行为(这里的多种类型应该具有通用结构),此时可使用统一的类型变量表达多种类型,这就是泛型。
在运行时根据具体指定类型确定具体类型
使用泛型变量的三种形式:泛型类,泛型接口,泛型方法
二、泛型类
1.定义
类中如果声明了一个或多个泛型变量,则成为泛型类。这些类型变量成为类的类型参数。
泛型类的最基本写法如下:
class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{
private 泛型标识 /*(成员变量类型)*/ var;
.....
}
}
2.例子
代码如下(示例):
public class Example<E> {
private final E name;
public Example(E name){
this.name = name;
}
public E getName(){
return name;
}
}
在这里Example就是一个泛型类,E就是类型参数
对其进行调用
Example<Integer> exampleInteger = new Example<Integer>(123);
Example<String> exampleString = new Example<String>("vlaue");
System.out.println(exampleInteger.getName);
System.out.println(exampleString.getName);
结果如下
123
vlaue
三、泛型接口
1.定义
如果一个接口声明了一个或多个类型变量,则它是泛型接口。
举个例子
public interface Animal<T>{
public T now();
}
Animal就是一个泛型接口,T是一个类型变量。
2.实现
2.1 泛型的实现类
class Dog<T> implements Animal<T>{
@Override
public T now() {
return null;
}
}
2.2 非泛型的实现类
public class Dog implements Animal<String> {
private String dog = "Peter";
@Override
public String now() {
return dog;
}
}
四、泛型方法
1.定义
如果一个方法声明了一个或多个类型变量,则它是泛型的。
举个例子
public <T> T genericMethod(Class<T> tClass){
T instance = tClass.newInstance();
return instance;
}
1.public 与 返回值中间非常重要,可以理解为声明此方法为泛型方法。
2.只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
3.表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
2.普通类中的泛型方法
public class GenericTest{
public <T> T genericMethod(...){
T var;
...;
}
}
3.泛型类中的泛型方法
举个例子
class GenerateTest<T>{
//下面的T与泛型类的类型变量一致,show_1不是泛型方法。
public void show_1(T t){
System.out.println(t.toString());
}
//在泛型类中声明了一个泛型方法,使用泛型E,这种泛型E可以为任意类型。可以类型与T相同,也可以不同。
public <E> void show_2(E t){
System.out.println(t.toString());
}
//在泛型类中声明了一个泛型方法,使用泛型T,注意这个T是一种全新的类型,可以与泛型类中声明的T不是同一种类型。
public <T> void show_3(T t){
System.out.println(t.toString());
}
}
对其进行调用
public static void main(String[] args){
GenericTest<String> genericTest = new GenericTest<>();
genericTest.show1("genericTest!"); //succeed, "genericTest!"
genericTest.show1(Integer.valueOf("1")); //compile error.这是因为泛型类型指定的实参是String,所以当类型为Integer时,报错
genericTest.show2(Integer.valueOf("1")); //succeed, 1
genericTest.show2(person); //succeed, maybe name of person
genericTest.show3(Integer.valueOf("1")); //succeed, 1
genericTest.show3(person); //succeed, maybe name of person
总结
本文介绍了泛型的三种使用方式,泛型类,泛型接口,泛型方法。在实际使用中,也要多多体会,去尝试用泛型开发,提高代码的可复用性。