泛型概念
泛型是一种未知的数据类型,可以看成一个变量用来接受数据类型
如ArrayList 在定义时 不知道会接受什么样的数据类型
ArrayList<E> // E 表示未知的数据类型
在创建集合对象时,就会确定泛型的数据类型
ArrayList <String> list = new ArrayList <string>();
把 String 作为参数传递给 E
泛型的好处
创建集合对象,不使用泛型
- 好处:集合不使用泛型,默认类别为Object类,可以存储任意类型的数据
- 坏处:不安全,会引发异常
使用泛型
好处: - 避免了类型转换的麻烦,存储什么类型,取出就什么类型
- 运行期异常在编译期就会显示(在写代码就是报错)
坏处 - 泛型是什么类型,就只能存储什么类型的数据
泛型的使用
泛型的定义
public class GenericClass<E>{
private E name;
public E getName(){
return name;
}
public E setName(E name){
this.name = name;
}
public static void main(String []args){
//不写泛型默认为Object类型
GenericClass gc = new GenericClass();
gc.setName("name");
Object obj = gc.getName
// 创建GenericClass对象,泛型使用String类型
GenericClass<String> gc2 = new GenericCClass<>();
gc2.setName("Jack");
String name1 = gc2.getName();
}
}
含有泛型的方法
在调用方法时确定泛型的数据类型
传递什么类型的参数 泛型就是什么类型
public class GenericClass{
public <M> method(M m){
System.out.println(m);
}
public static <S> method2(S s){
System.out.println(s);
}
public static void main(String []args){
//不写泛型默认为Object类型
GenericClass gc = new GenericClass();
gc.method("abc");
gc.method(1);
gc.method(8.8);
gc.method(true);
gc.method2("静态方法,不建议创建对象使用");
GenericClass.method2("静态方法");
GenericClass.method2(1);
}
}
含有泛型的接口
public interface GenericInterface<I>{
public abstract void method(I i);
}
//第一种使用方式:定义接口的实现类,实现接口,指定接口的泛型
/*
public interface Iterator<E>{
E next();
}
Scanner类实现了Iterator接口 并指定接口泛型为String 重写的next方法泛型默认为String
public final class Scanner implements Interator Iterator<String>{
public String next(){...}
}
*/
public class GenericInterfaceImpl_1 implenments GenericInterface<String>{
@Override
public void method(String s){
System.out.println(s);
}
}
/*
第二钟使用方式:接口使用什么泛型 实现类就用什么类型 类跟接口走
相当于定义一个泛型的类 创建对象时确定泛型的类型
public interface List<E>{
boolean add(E e);
E get(int index);
}
public class ArrayList<E> implements List<E>{
public boolean add(E e){...}
public E get(int index){...}
}
*/
// 实现类不用指定
public class GenercClassImpl_2 implements GenericClass{
@Override
public void method(I i){
System.out.println(i);
}
}
//在创建时指定类型
public static void main(String []args){
GenericInterfaceImpl_2<String> gc2 = new GenericInterfaceImpl_2<>();
gc2.method("namr");
}
泛型通配符 “?” :代表任意的数据类型
“?” :代表任意的数据类型
不能创建对象使用
只能作为方法的参数使用
public class Gnenric{
public static void main(String [] args){
ArrayList<Integer> list_1 = new ArrayList<>();
list_1.add(1);
ArrayList<String> list_2 = new ArrayList<>();
list_2.add("jack");
}
/*
错误写法:
public static void printArray(ArrayList<Object> list){...}
泛型没有继承概念
*/
public static void printArray(ArrayList<?> list){
Iterator<?> it = list.iterator();
while(it.hasNext()){
Object p = it.next();
System.out.println(o);
}
}
}
泛型通配符——受限泛型
泛型上限 ?extends E 代表使用的泛型只能是E类型的子类/本身
泛型上限 ?super E 代表使用的泛型只能是E类型的父类/本身
视频来源:https://www.bilibili.com/video/BV1T7411m7Ta/?p=246