Java泛型相关学习
1.什么是泛型
泛型,即”参数化类型”,在不创建新的类型的情况下,通过泛型指定不同类型来控制形参具体参数类型.这种参数类型可以用在类,接口,方法中,分别被称作泛型类,泛型接口,泛型方法.
泛型只在编译阶段有效,参数的类型是在编译阶段就确定了,编译器会在生成的代码中是用确定的类型替换.
2.泛型类
泛型类的最基本写法
class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{
}
public class Generic<T>{
//key这个成员变量的类型为T,T的类型由外部指定
private T key;
public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
this.key = key;
}
public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
return key;
}
}
3.泛型接口
//定义一个泛型接口
public interface Generator<T> {
public T next();
}
实现一个泛型接口
/**
* 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
* 即:class FruitGenerator<T> implements Generator<T>{
* 如果不声明泛型,如:class FruitGenerator implements Generator<T>,编译器会报错:"Unknown class"
*/
class FruitGenerator<T> implements Generator<T>{
@Override
public T next() {
return null;
}
}
4.泛型通配符
类型通配符一般是使用?代表具体的类型实参,实际使用的时候可以是对应的类型,可以代表所有类型的父类.
5.泛型方法可变参数
public <T> void printMsg( T... args){
for(T t : args){
Log.d("泛型测试","t is " + t);
}
}
6.泛型边界限制
有时候我们要对泛型的类型进行限制,必须是某一些类型而不是全部类型,就需要用到泛型边界
例子
public void showKeyValue1(Generic<? extends Number> obj){
Log.d("泛型测试","key value is " + obj.getKey());
}