黑马程序员_泛型_5

时间:2023-02-18 07:57:01


    ----------- 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