黑马程序员_泛型_5

来源:互联网 发布:mysql 创建联合索引 编辑:程序博客网 时间:2024/06/05 11:43


    ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

泛型是JDK15版本以后出现的新特性。用于解决安全问题,是一个安全机制。出现的主要原因有:1、将运行时期出现问题ClassCastException,转移到编译时期,方便于程序员解决问题,让运行时问题减少,安全。2、避免了强制转换的麻烦。定义泛类的方法是<>里面来定义要操作的引用数据类型。注意,因为equals方法是来至于Object,出现在1.0版本,所以equals方法里面一定要强制转换。泛类主要运用于定义泛类类和接口,或者定义泛类方法。

 

定义泛型类和接口。定义泛类类和接口的方法是,在类名后面加上<E>。如下面的演示:

import java.util.*;public class GenericClassDemo {public static void main(String[] args) {GenericStack<String> stack = new GenericStack<>();stack.push("abc1");stack.push("abc2");stack.push("abc3");stack.push("abc4");// stack.push(1);            //插入不是String类型的,编译是就会报错String a = stack.peek();         //不用类型转换String b = stack.pop();        int num = stack.getSize();boolean i = stack.isEmpty();System.out.println(a);System.out.println(b);System.out.println(num);System.out.println(i);}}class GenericStack<E>{             //运用泛型来定义一个类private ArrayList<E> arrayList = new ArrayList<>();public int getSize() {return arrayList.size();}public E peek() {return arrayList.get(getSize() - 1);}public void push(E o) {arrayList.add(o);}public E pop() {E o = arrayList.get(getSize() - 1);arrayList.remove(getSize() - 1);return o;}public boolean isEmpty() {return arrayList.isEmpty();}} 

定义泛型方法:定义泛类方法的是把泛类定义在返回值之前,然后参数里面就可以运用泛类了。需要注意的是,静态方法不可以访问类中上定义的泛类,因为静态方法比对象先存在于内存中。这个时候,可以把泛类定义在方法上。调用泛类方法的时候,需要将实际类型放在<>内作为方法名的前缀。下面是定义泛类方法的演示:

 

public class GenericFunctionDemo {public static void main(String[] args) {Integer[] integers = {1, 2, 3, 4};String[] strings = {"abc1", "abc2", "abc3", "abc4"};print(integers);print(strings);}public static <E> void print(E[] list) {for (int i = 0; i < list.length; i++) {System.out.println(list[i] + " ");}System.out.println();}}

 

泛型的限定。举个例子来说明。ArrayList<Person> a = new ArrayList<Student>(),这条语句是会报错的。虽然Person是Student的父类,但是并不能说ArrayList<Person>就是ArrayList<Student>的子类。JAVA中的限定有向上限定和向下限定。向上限定的表现形式:? extends E,向下限定的形式是? super E。下面演示这个限定的用法

import java.util.*;public class GenericBindDemo {public static void main(String[] args) {GenericStack<Integer> intStack = new GenericStack<Integer>();intStack.push(1);intStack.push(2);intStack.push(3);System.out.println(max(intStack));}public static double max(GenericStack<? extends Number> stack) {double max = stack.pop().doubleValue();while (!stack.isEmpty()) {double value = stack.pop().doubleValue();if (value > max) {max = value;}}return max;}}class GenericStack<E extends Number>{             //运用泛类来定义一个类private ArrayList<E> arrayList = new ArrayList<>();public int getSize() {return arrayList.size();}public E peek() {return arrayList.get(getSize() - 1);}public void push(E o) {arrayList.add(o);}public E pop() {E o = arrayList.get(getSize() - 1);arrayList.remove(getSize() - 1);return o;}public boolean isEmpty() {return arrayList.isEmpty();}}


注意:编译器使用泛型类型信息来编译代码,但随后会消除它,所以不能使用new E();不能使用 new E[]。静态环境下不允许类的参数是泛型类型。


     ----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima



原创粉丝点击