目录
一.泛型基本了解
本质:参数化类型
泛型的擦除:
- 泛型只在编译阶段有效,编译之后JVM会采取去泛型化的措施.
- 泛型在运行阶段是没有效果
泛型通配符的介绍
1.无边界通配符
List<?>//所有类型都可以
2.上边界通配符
List<? extends Number>//表示 Number以及以下的都可以 例如 Number Integer Long Double 都可以 Object就不行
3.下边界通配符
List<? super Integer>
//表示 Integer以及以上的都可以 例如 Number Object 都可以 Long Double就不行
基本类型关系图:
二.泛型的具体使用
规则:
- 泛型使用前要先进行声明
- 泛型的声明是通过"<>"实现
- 约定泛型可以使用单个大写字母来表示K E J V T等
public static <T> T fxTest(T t) {
return null;
}
泛型类
public class FxClass <T>{
private T data;
public FxClass(T t){
this.data = t;
}
@Override
public String toString() {
return "FxClass{" +
"data=" + data +
'}';
}
}
test
//String类型
FxClass<String> classTest1 = new FxClass<>("hello");
System.out.println(classTest1);
//int类型
FxClass<Integer> classTest2 = new FxClass<>(7486);
System.out.println(classTest2);
结果
FxClass{data=hello}
FxClass{data=7486}
泛型方法
- 普通方法可以使用类中定义的泛型
- 静态方法不可以使用类中定义的泛型因为类中定义的泛型 只有当我们new对象的时候才能知道是什么类型。所以静态方法需要单独定义泛型
public class FxClass <T>{
private T data;
public FxClass(T t){
this.data = t;
}
/**
* 普通方法可以使用类中定义的泛型
* @return
*/
public T getData() {
return data;
}
/**
* 静态方法不可以使用类中定义的泛型
* 因为类中定义的泛型 只有当我们new对象的时候才能知道是什么类型
* 所以静态方法需要单独定义泛型
* @return
*/
public static <K> K putDataVal(K k) {
return null;
}
@Override
public String toString() {
return "FxClass{" +
"data=" + data +
'}';
}
}
泛型接口
接口
public interface FxInterface<T> {
//加法接口
T add(T t1, T t2);
}
int实现类
public class FxIntImpl implements FxInterface<Integer>{
@Override
public Integer add(Integer t1, Integer t2) {
return t1 + t2;
}
}
Double实现类
public class FxDoubleImpl implements FxInterface<Double>{
@Override
public Double add(Double t1, Double t2) {
return t1 + t2;
}
}
泛型的正确使用可以提高我们代码的灵活度