使用泛型类的优势?
可以在程序编译时而不是运行时检测出错误,保证代码安全性、可靠性
理解泛型
public class GenericStack<T> {
private T data;
public GenericStack(T data) {
this.data = data;
}
public T getData() {
return data;
}
public <U> void processData(U input) {
System.out.println("Processing data: " + data);
System.out.println("Additional input: " + input);
}
public static <V> void staticMethod(V value) {
System.out.println("Static method with value: " + value);
}
public static void main(String[] args) {
GenericStack<String> stringObj = new GenericStack<>("Hello, Generics!");
System.out.println("Data: " + stringObj.getData());
stringObj.processData(42);
GenericStack.staticMethod("Static");
GenericStack<Integer> integerObj = new GenericStack<>(100);
System.out.println("Data: " + integerObj.getData());
integerObj.processData("Generic");
GenericStack.staticMethod(3.14);
}
}
(原始类型:不使用类型参数的泛型类)
声明:ArrayList <String> myList = new ArrayList <>();
赋值:myList.add(“red”)
泛型类型一定是引用类型Integer String Double Float
不能是8种基本数据类型
boolean int float double long char byte short不可以
非受限通配 ? 和? extends Object一样
受限通配 ?extends扩展类型 表示T或T的一个子类型
下限通配 ?super超级类型 表示T或T的一个父类型
编译器可使用泛型信息,但这些信息在运行时是不可用的,这些类型被称为消除。
这个方法能够使泛型代码向后兼容使用原始类型的遗留代码。
来一个编程题看看
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class ArrayListStack<E> extends ArrayList<E> {
public int getSize() {
return super.size();//查看栈的大小
}
public E peek() {//查看栈顶元素
return super.get(getSize() - 1);
}
public void push(E o) {//将元素压入栈
super.add(o);
}
public E pop() {//弹出栈顶元素
E o = super.get(getSize() - 1);
super.remove(getSize() - 1);
return o;
}
public boolean isEmpty() {//判断是否栈空
return super.isEmpty();
}
//重写toString字符串方法,用字符串形式表示栈
@Override
public String toString() {
return "stack: " + super.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Please enter five strings");
//创建一个ArrayListStack对象
ArrayListStack<String> stack=new ArrayListStack<String>();
Scanner scan=new Scanner(System.in);
//依次将五个字符串push入栈
for(int i=0;i<5;i++)
{
stack.push(scan.nextLine());
}
System.out.println(stack);//打印原始栈
Collections.reverse(stack);//逆序
System.out.println(stack);
}
}