博罗做网站哪家强,网站怎么优化关键词,wordpress文章目录树,芜湖弋江区最新消息1.泛型 介绍#xff1a; 泛型可以在编译阶段约束操作的数据类型#xff0c;并进行检查。
应用场景#xff1a; 如果在定义类、方法、接口的时候#xff0c;如果类型不确定#xff0c;就可以使用泛型。
格式#xff1a; 数据类型
注意#xff1a; 泛型只支持引…1.泛型 介绍 泛型可以在编译阶段约束操作的数据类型并进行检查。
应用场景 如果在定义类、方法、接口的时候如果类型不确定就可以使用泛型。
格式 数据类型
注意 泛型只支持引用数据类型
如下图中String就是泛型 细节 1.指定泛型的具体类型后传递数据时可以传入该类型或者其子类类型 2.如果不写泛型类型默认为Object
好处 1.统一数据类型 2.把运行时期的问题提前到了编译期间避免了强制类型转换可能出现的异常因为在编译阶段类型就能确定下来
扩展 Java中的泛型为伪泛型即若使用泛型确定类型后元素若要存入集合泛型就会检查是否为规定的类存入集合中时元素为Object类但是获取元素时代码底层会将Object类强转成泛型规定的类。 且编译时会擦除泛型在class文件中集合中的元素仍为Object类。 2.泛型类 泛型类即在类名后面添加泛型约束的类。
下面创建一个泛型类
代码演示
泛型类MyArratList
public class MyArrayList E {Object[] obj new Object[10];int size;public boolean add(E e) {obj[size] e;size;return true;}public E get(int index) {return (E) obj[index];}Overridepublic String toString() {return Arrays.toString(obj);}
}测试类GenericsDemo
public class GenericsDemo {public static void main(String[] args) {MyArrayListInteger list new MyArrayList();list.add(111);list.add(222);list.add(333);System.out.println(list);System.out.println(list.get(1));}
}
运行结果 3.泛型方法
介绍 泛型方法有两种形式一种是泛型类中的方法都可以使用类名后定义的泛型第二种是在方法申明上定义自己的泛型只有本方法能用下面详细介绍第二种形式。
格式
修饰符 类型 返回值类型 方法名类型 变量名{
}
小练习 定义一个工具类ListUtil类中定义一个静态方法addAll用来添加多个集合元素
代码
ListUtil类
public class ListUtil {//因为是工具类不需要构造方法private ListUtil(){}public static E void addAll(ArrayListE list,E...e) {for (E element : e) {list.add(element);}}
}
测试类Test
public class Test {public static void main(String[] args) {ArrayListString list new ArrayList();ListUtil.addAll(list,aaa, bbb, ccc);System.out.println(list);}
}运行结果 4.泛型接口 当借口中类型不确定时就可以使用泛型接口
格式 修饰符 interface 接口名类型{
}
使用方法
方法一.实现类给出具体类型
代码演示
演示代码具体类型为String
ListString即为泛型接口重写List中的方法后其中的泛型方法类型也被指定为String
public class MyArrayList2 implements ListString {Overridepublic int size() {return 0;}Overridepublic boolean isEmpty() {return false;}Overridepublic boolean contains(Object o) {return false;}Overridepublic IteratorString iterator() {return null;}Overridepublic Object[] toArray() {return new Object[0];}Overridepublic T T[] toArray(T[] a) {return null;}Overridepublic boolean add(String s) {return false;}Overridepublic boolean remove(Object o) {return false;}Overridepublic boolean containsAll(Collection? c) {return false;}Overridepublic boolean addAll(Collection? extends String c) {return false;}Overridepublic boolean addAll(int index, Collection? extends String c) {return false;}Overridepublic boolean removeAll(Collection? c) {return false;}Overridepublic boolean retainAll(Collection? c) {return false;}Overridepublic void clear() {}Overridepublic String get(int index) {return null;}Overridepublic String set(int index, String element) {return null;}Overridepublic void add(int index, String element) {}Overridepublic String remove(int index) {return null;}Overridepublic int indexOf(Object o) {return 0;}Overridepublic int lastIndexOf(Object o) {return 0;}Overridepublic ListIteratorString listIterator() {return null;}Overridepublic ListIteratorString listIterator(int index) {return null;}Overridepublic ListString subList(int fromIndex, int toIndex) {return null;}
} 方法二.实现类延续泛型创建对象时再确定
代码演示
这种情况下重写的List方法中使用泛型的继续使用类名后定义的泛型
public class MyArrayList3E implements ListE {Overridepublic int size() {return 0;}Overridepublic boolean isEmpty() {return false;}Overridepublic boolean contains(Object o) {return false;}Overridepublic IteratorE iterator() {return null;}Overridepublic Object[] toArray() {return new Object[0];}Overridepublic T T[] toArray(T[] a) {return null;}Overridepublic boolean add(E e) {return false;}Overridepublic boolean remove(Object o) {return false;}Overridepublic boolean containsAll(Collection? c) {return false;}Overridepublic boolean addAll(Collection? extends E c) {return false;}Overridepublic boolean addAll(int index, Collection? extends E c) {return false;}Overridepublic boolean removeAll(Collection? c) {return false;}Overridepublic boolean retainAll(Collection? c) {return false;}Overridepublic void clear() {}Overridepublic E get(int index) {return null;}Overridepublic E set(int index, E element) {return null;}Overridepublic void add(int index, E element) {}Overridepublic E remove(int index) {return null;}Overridepublic int indexOf(Object o) {return 0;}Overridepublic int lastIndexOf(Object o) {return 0;}Overridepublic ListIteratorE listIterator() {return null;}Overridepublic ListIteratorE listIterator(int index) {return null;}Overridepublic ListE subList(int fromIndex, int toIndex) {return null;}
} 5.泛型通配符
作用 可以限制类型的范围
应用场景 如果类型不确定但是知道传递的都是哪个继承体系中的就可以使用泛型的通配符
格式 extend E 表示可以传递E和E的所有子类类型 super E 表示可以传递E和E的所有父类类型
代码演示
public class GenericsDemo2 {public static void main(String[] args) {//创建Ye Fu Zi的集合ArrayListYe list1 new ArrayList();ArrayListFu list2 new ArrayList();ArrayListZi list3 new ArrayList();//调用方法method(list1);method(list2);method(list3);}//定义方法在集合中调用对象public static void method(ArrayList? extends Ye list){System.out.println(list);}//创建最高父类爷class Ye{}//创建父继承爷class Fu extends Ye{}//创建子继承父class Zi extends Fu{}
}
运行结果 也可以把上述method方法中的泛型通配符改成? super Zi 和上述代码效果一样。