本文主要介绍的java基础中的泛型的相关知识,包括泛型的介绍和用法 。
一、什么是泛型
泛型泛指一切类型,能够代表一切类型,是一种在编程中广泛使用的概念,特别是在面向对象编程中。它允许在编写代码时使用类型参数,这些参数在代码被实际使用时才会被具体的类型所替换。简单来说,泛型就是将类型参数化,使得一个类或方法能够操作多种数据类型,而不仅仅是预先定义好的一种或几种类型。
泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。
二、为什么引用泛型
1、先通过实现一个栈(先进后出)了解什么是泛型和调用泛型的原因。
例:流程图
创建一个int数组,定义一个游标i,定义数组大小,编写添加数据和输出数据的方法。但此时只能存储int类型数据,如果向存储其他类型数据,可以重现创建一个类修改数据类型,但太过繁琐,所以引入泛型,泛指一切类型,能够代表一切类型,将其他数据类型进行转换。
使用泛型后。
三、如何用泛型
1、泛型类
泛型类就是在类定义时通过类型参数指定类中某些属性的类型。
定义语法:
在类后边加< 具体类型名>
在变量名前加 泛型类型名
格式:
class 类名称 <泛型标识、泛型标识,...> {
private 泛型标识 变量名;
......
}
举例:
public class Box<T> {
// T stands for "Type"
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
// 使用泛型类
Box<Integer> integerBox = new Box<>();
integerBox.set(123);
Integer number = integerBox.get();
Box<String> stringBox = new Box<>();
stringBox.set("Hello World");
String str = stringBox.get();
使用语法
类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>();
java 1.7以后,后边的<>中具体的数据类型可以省略不写
类名<具体的数据类型> 对象名 = new 类名<>();
2、泛型方法
泛型方法是在调用方法时指定类型参数的方法。
举例:
public class Util {
// 泛型方法 printArray
public static < E > void printArray( E[] inputArray ) {
// 显示数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
}
// 使用泛型方法
Integer[] intArray = { 1, 2, 3, 4, 5 };
Util.printArray( intArray );
String[] stringArray = { "Hello", "World" };
Util.printArray( stringArray );
3、泛型接口
使用语法
泛型接口与泛型类类似,只是它定义了一个或多个类型参数作为接口的一部分。
public interface 接口名<类型参数> {
...
}
举例:
public interface Pair<K, V> {
public K getKey();
public V getValue();
}
// 实现泛型接口
class OrderedPair<K, V> implements Pair<K, V> {
private K key;
private V value;
public OrderedPair(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() { return key; }
@Override
public V getValue() { return value; }
}
// 使用泛型接口
Pair<String, Integer> p = new OrderedPair<>("Even", 8);
4、类型通配符
类型通配符(Wildcard Types)主要用于提高代码的灵活性。
?
表示未知类型。? extends T
表示未知的类型,它是T的子类或T本身。? super T
表示未知的类型,它是T的父类或T本身。
List<?> wildcardList = new ArrayList<String>();
List<? extends Number> numList = new ArrayList<Integer>();
// numList.add(new Integer(10)); // 编译错误
List<? super Integer> intSuperList = new ArrayList<Number>();
intSuperList.add(new Integer(10)); // 正确
5、 泛型限制
泛型类、接口和方法可以有类型限制,以确保类型安全。
public class Pair<K extends Comparable<K>, V> {
// 类实现
}
在上面的例子中,K
必须是实现了 Comparable<K>
接口的类型。
总结
泛型是Java中一种非常强大的特性,它提供了编译时期的类型检查,增加了代码的复用性和安全性。理解并熟练使用泛型,对于编写高质量的Java代码至关重要。