使用泛型
884字约3分钟
2024-08-08
泛型的三种使用方式
泛型类
泛型接口
泛型方法
泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List
、Set
、Map
基本写法
class 类名 <泛型标识:任意标识号,标识指定的泛型类型>{
private 泛型标识 字段名;
.....
}
栗子
/**
* 此处 T 可以随便写为任意标识,且可以多个,常见的如T、E、K、V等形式的参数常用于表示泛型
* @param <T>
*/
public class Generic<T> {
// fieldName 这个成员变量的类型为 T,T 的类型由外部指定
private T fieldName;
// 泛型构造方法形参 fieldName 的类型也为 T,T 的类型由外部指定
public Generic(T key) {
this.fieldName = fieldName;
}
// 泛型方法 getKey 的返回值类型为 T,T 的类型由外部指定
public T getKey(){
return fieldName;
}
}
泛型接口
// 定义一个泛型接口
public interface Generator<T> {
public T method();
}
泛型方法
泛型方法介绍
public
与返回值中间<T>
非常重要,可以理解为声明此方法为泛型方法只有声明了
<T>
的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法<T>
表明该方法将使用泛型类型T
,此时才可以在方法中使用泛型类型T
与泛型类的定义一样,此处
T
可以随便写为任意标识,常见的如T
、E
、K
、V
等形式的参数常用于表示泛型
public <T> T genericMethod(Class<T> tClass)throws InstantiationException ,
IllegalAccessException{
T instance = tClass.newInstance();
return instance;
}
栗子
/**
* 泛型类
*
* @param <T>
*/
public class Generic<T> {
private T key;
/**
* 这才是一个真正的泛型方法。
* 首先在 public 与返回值之间的 <T> 必不可少,这表明这是一个泛型方法,并且声明了一个泛型 T
* 这个 T 可以出现在这个泛型方法的任意位置.
* 泛型的数量也可以为任意多个
* 如:public <T,K> K showKeyName(Generic<T> container){
* ...
* }
*/
public <T> T showKeyName(Generic<T> container) {
System.out.println("container key :" + container.getKey());
T test = container.getKey();
return test;
}
/**
* 方法中使用了泛型,并非泛型方法
* 这只是一个普通成员方法,只不过返回值是泛型类已经声明过的泛型
* 所以在这个方法中才可以继续使用 T 这个泛型
*/
public T getKey() {
return key;
}
/**
* 这个方法显然是有问题的
* 因为在类的声明中并未声明泛型 E,所以在使用 E 做形参和返回值类型时,编译器会无法识别
*/
public E setKey(E key){
this.key = key;
}
/**
* 这就是一个普通的方法,不是泛型方法
* 只是使用了 Generic<Number> 这个泛型类做形参而已。
*/
public void showKeyValue1(Generic<Number> obj) {
System.out.println("key value is " + obj.getKey());
}
/**
* 这也是一个普通的方法,也不是一个泛型方法
* 只不过使用了泛型通配符 ?
*/
public void showKeyValue2(Generic<?> obj) {
System.out.println("key value is " + obj.getKey());
}
/**
* 这个方法是有问题的,编译器会为我们提示错误信息:Cannot resolve symbol 'E'
* 虽然我们声明了 <T> ,也表明了这是一个泛型方法。
* 但是只声明了泛型类型 T ,并未声明泛型类型 E ,因此编译器并不知道该如何处理 E 这个类型
*
*/
public <T> T showKeyName(Generic<E> container){
}
}