Java基础(2)|范型
Java基础(2)|范型
1、范型优点
1、代码简洁,不用强制转换
2、程序更加健壮(编译时期没有警告,运行时就不会出现ClassCastExpection异常)
3、可读性和稳定性(限定了类型)
2、泛型基础
类上定义的泛型,方法上也可以使用,类上声明的泛型只能对非静态成员有效
public class ObjectTool<T> {
private T obj;
}
创建类时指定类型,使用时会自动转换
ObjectTool<String> tool = new 0bjectTool<>();
泛型先定义,后使用
//定义泛型方法..
public <T> void show(T t) {
System.out.println(t)
}
类型通配符,如:参数中传递一个list集合,但不确定时什么类型。
public void test(List<?> list){} // ? :任意类型,只能传?所代表的的类型
为什么不用list<Object>? 答:可以传所有类型进去
list<Object> 跟 List<String>毫无关系,仔细品
设定通配符上限
如:参数中传递一个list集合,但只能是(integer,short,byte,double)类型,怎么弄?
List<? extends Number> //子类或者自身
设定通配符下限
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
有什么用?
假若你想比较字符串的大小,你可以传入一个比较器(Comparator<String>),也可以传入Object的比较器(Comparator比较器),
会使代码更加灵活(只要能够比较字符串的大小就行了)
总结
带有子类限定的,可以从泛型读取
带有超类限定的,可以从泛型写入
关于泛型与通配符
//使用通配符
public static void test(List<?> list) {}
//使用泛型方法
public <T> void test2(List<T> t) {}
常用的泛型字符含义
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 表示不确定的java类型
一般怎么使用他们呢?
答:
一、泛型:
参数之间有依赖关系
返回值与参数之间有依赖关系
二、通配符
无依赖关系的
泛型擦除:泛型在编译成class文件后,会进行擦除。
应用场景
1、ElasticsearchRepository
2、SpringDataJpa