泛型:标识着集合中保存的元素
<泛型(类型)>
泛型前后类型要一致
后面的类型可以省去
ArrayList<String> list=new ArrayList<>();
另一种泛型
? extends E
问号是子类 E是父类
只能使用父类的子类或本类
也叫向下限定
addAll(Collection<? extends E> c)
好处:
1.操作数据更加安全(规范集合中能保存的数据)
2.可以避免向下转型(强转类型)的麻烦
3.将运行时的错误转到编译时报错
private static void fun2() {
//不加泛型 集合中保存三个学生
ArrayList<Student> list=new ArrayList<>();
list.add(new Student("哈哈1",11));
list.add(new Student("哈哈2",12));
list.add(new Student("哈哈3",13));
//从集合中取出一个元素
Object object = list.get(0);
Student student=(Student)object;
System.out.println(student.getName());
//从集合中取出一个元素强转成工人类型
//调用工人的工作方法
//不加泛型 获取到集合中的元素
//元素的类型你可以随便强转 没有约束
//编译都会通过
//加上泛型 可以在编译时有错误提示
//让集合中保存的元素更加安全
Object object2 = list.get(1);
Worker worker=(Worker)object2;
worker.work();
}
泛型类
在类的声明上 添加一个泛型
使用的字母(大小写都行)
这个泛型可以在类中进行使用
类上声明的泛型
会在创建对象的时候被赋值真正的类型
public class Worker<Z> {
//成员变量
private Z z;
//成员方法set/get方法
public void setZ(Z z) {
this.z=z;
}
public Z getZ() {
return z;
}
//一个类中可以存在几个泛型
//如果你在方法中声明了新的泛型
//该泛型会在方法被调用的时候赋值泛型
//需要在方法中声明出来泛型
public <W> void fun(W w) {
System.out.println(w);
}
//静态方法能不能使用泛型Z
//不能使用类声明上的泛型
//直接使用类型调用静态方法的时候
//没有对象的创建 Z泛型还没有被赋值
//使用泛型可以单独声明一下(static后面)
private static<Q> void sayHi(Q q) {
System.out.println(q);
}
多参数的参数
int ... num 这个参数可以看成是一个数组
可以当做数组来遍历
使用方式
1.直接传一个数组
2.传多个数用逗号分开
注意:多个参数时 最好把多参数放到最后
public static void fun4(int ... num) {
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}
}
数组转集合
private static void fun6() {
//数组转集合
int[] array= {1,2,3,4,5};
//根据泛型 这个集合中每一个元素都是一个数组
List<int[]> list = Arrays.asList(array);
System.out.println(list);
//直接传入 int[] 系统不会帮你进行自动装箱
Integer[] newArray= {1,2,3,4,5};
//直接把数组中的元素放入了集合中
List<Integer> newList = Arrays.asList(newArray);
System.out.println(newList);
}