10.【Java核心.泛型】常用的泛型书写语法及泛型所处的阶段
泛型:
本质:参数化类型
泛型的擦除:
泛型只在编译阶段有效,编译之后JVM会采取去泛型化
的措施.
泛型在运行阶段是没有效果
泛型通配符
1.无边界通配符
通用的类型
public class Demo02 {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("nick");
list1.add("tom");
list1.add("coco");
loop(list1);
}
public static void loop(List<?> list){
for (int i = 0; i < list.size() ; i++) {
System.out.println(list.get(i));
}
}
}
2.上边界通配符
< ? extends Number > 代表从Number往下的子类或孙类对象都可以使用
public class Demo03 {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("nick");
list1.add("tom");
list1.add("coco");
// loop(list1);
List<Number> list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(3);
}
/**
* ? extends Number
* 通用的类型必须是Number及其子类
* @param list
*/
public static void loop(List<? extends Number> list){
for (int i = 0; i < list.size() ; i++) {
System.out.println(list.get(i));
}
}
}
3.下边界通配符
代表从Integer 到Object所有的对象都可以
public class Demo04 {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("nick");
list1.add("tom");
list1.add("coco");
loop(list1);
List<Number> list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(3);
loop(list2);
}
/**
* ? super Number
* 通用类型必须是Integer 到Object类型的对象
* @param list
*/
public static void loop(List<? super Number> list){
for (int i = 0; i < list.size() ; i++) {
System.out.println(list.get(i));
}
}
}
泛型的具体的使用
规则
1.必须先声明再使用
2.泛型的声明是通过"<>"实现
3.约定泛型可以使用单个大写字母来表示 K E T V 等
泛型类
public class PersonNew <T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public PersonNew(T t) {
this.t = t;
}
}
增加我们代码的灵活度
泛型方法
public class Demo07 <K,V> {
/**
* 普通方法 可以使用 类中定义的泛型
* @param k
* @param v
* @return
*/
public K method1(K k,V v){
return (K)null;
}
/**
* 普通方法 使用方法中定义的泛型
* @param t
* @param v
* @param <T>
* @return
*/
public <T> T method2(T t,V v){
return (T)null;
}
/**
* 在静态方法中我们没法使用 类中定义的泛型
* @return
*/
public static <K> K method3(){
return null;
}
泛型接口
public interface CalGeneric <T> {
T add(T a,T b);
T sub(T a,T b);
T mul(T a,T b);
T div(T a,T b);
}
public class CalIntegerGeneric implements CalGeneric<Integer> {
@Override
public Integer add(Integer a, Integer b) {
return null;
}
@Override
public Integer sub(Integer a, Integer b) {
return null;
}
@Override
public Integer mul(Integer a, Integer b) {
return null;
}
@Override
public Integer div(Integer a, Integer b) {
return null;
}
}