泛型简介
创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为 Object 类型,类型作为参数传递
泛型标记符:
- E e:Element
- T t:Type
- K k:Key
- V v:Value
- N n:Number
- ?:不确定的 Java 类型
泛型使用
泛型方法
泛型方法在调用时接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用
修饰符 <泛型> 返回值类型 方法名(参数列表) {
//方法体
}
类型参数只能代表引用型类型,不能是原始类型(像 int、double、char 等)
public class GenericMethodTest {
// 泛型方法 printArray
public static <E> void printArray(E[] inputArray) {
// 输出数组元素
for (E element : inputArray) {
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] ) {
// 创建不同类型数组: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println( "整型数组元素为:" );
printArray( intArray ); // 传递一个整型数组
System.out.println( "\n双精度型数组元素为:" );
printArray( doubleArray ); // 传递一个双精度型数组
System.out.println( "\n字符型数组元素为:" );
printArray( charArray ); // 传递一个字符型数组
}
}
泛型接口
修饰符 interface接口名<泛型> { }
public interface GenericInterface<I> {
public abstract void method(I i);
}
泛型类
修饰符 class 类名<泛型> { }
- 泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开
public class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
}
受限泛型
JAVA 泛型中可以指定一个泛型的上限和下限
泛型的上限:
- 格式:
类型名称 <? extends 类 > 对象名称
- 意义: 只能接收该类型及其子类
泛型的下限:
- 格式:
类型名称 <? super 类 > 对象名称
- 意义: 只能接收该类型及其父类型
// 泛型的上限:此时的泛型?,必须是 Number 类型或者 Number 类型的子类
public static void getElement1(Collection<? extends Number> coll){ }
// 泛型的下限:此时的泛型?,必须是 Number 类型或者 Number 类型的父类
public static void getElement2(Collection<? super Number> coll){ }
public static void main(String[] args) {
Collection<Integer> list1 = new ArrayList<Integer>();
Collection<String> list2 = new ArrayList<String>();
Collection<Number> list3 = new ArrayList<Number>();
Collection<Object> list4 = new ArrayList<Object>();
getElement(list1);
getElement(list2); // 报错
getElement(list3);
getElement(list4); // 报错
getElement2(list1); // 报错
getElement2(list2); // 报错
getElement2(list3);
getElement2(list4);
}