泛型概述和好处
泛型是JDK5中引入的新特性,提供的是编译时类型安全检查机制,允许在编译时检测到非法的类型,它的本质是将类型参数化,也就是说所操作的数据类型被指定为一个参数,顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口。
-泛型定义格式
1.<类型>:指定一种类型的格式。这里的类型可以看成是形参
2.<类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参,将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
3.将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
总之,按照我日常编码的理解,泛型就是先不去管数据的具体类型,抽象成一个类 等到具体使用的时候再去修改相应的类型。
public class Generic {
public <T> void show(T t) {
System.out.println(t);
}
}
public class demo {
public static void main(String[] args){
Generic g1 = new Generic();
g1.show(new String("sss"));
g1.show(new Integer(5));
}
}
输出结果:
sss
5
类型通配符
我对于类型通配符的理解就是相当于对于泛型类可以设定一个上限和下限的范围;
如在具体开发中对于某个类如 连衣裙 我们就可以限定它在裙子 和 西式连衣裙这个范围类
西式连衣裙 extends 连衣裙 extends 裙子
这样就避免了java 编译过程中一些空间的浪费
下面是示例代码:
public class GenericDemo {
public static void main(String[] args) {
//类型通配符:<?>
List<?> list1 = new ArrayList<Object>();
List<?> list2 = new ArrayList<Number>();
List<?> list3 = new ArrayList<Integer>();
System.out.println("--------");
//类型通配符上限:<? extends 类型>
// List<? extends Number> list4 = new ArrayList<Object>();
List<? extends Number> list5 = new ArrayList<Number>();
List<? extends Number> list6 = new ArrayList<Integer>();
System.out.println("--------");
//类型通配符下限:<? super 类型>
List<? super Number> list7 = new ArrayList<Object>();
List<? super Number> list8 = new ArrayList<Number>();
// List<? super Number> list9 = new ArrayList<Integer>();
}
}
可变参数
可变参数定义格式
修饰符 返回值类型 方法名(数据类型… 变量名) { }
可变参数的注意事项
这里的变量其实是一个数组
如果一个方法有多个参数,包含可变参数,可变参数要放在最后
可变参数的基本使用举例:
public void sum(int a, int ...b)
{
int sum=0;
for(int i:b){
sum+=i;
}
System.out.println(sum);
}
基本举例
Arrays工具类中有一个静态方法:
public static List asList(T… a):
返回由指定数组支持的固定大小的列表
返回的集合不能做增删操作,可以做修改操作(如替换)
List接口中有一个静态方法:
public static List of(E… elements):
返回包含任意数量元素的不可变列表
返回的集合不能做增删改操作
Set接口中有一个静态方法:
public static Set of(E… elements) :
返回一个包含任意数量元素的不可变集合
在给元素的时候,不能给重复的元素
返回的集合不能做增删操作,没有修改的方法