半小时通透Java的泛型
Java中的泛型可以在编译时期强制类型检查,提高代码的可读性和可维护性。本篇文章将通过以下几个方面入门讲解Java的泛型。
为何需要泛型
Java是一门强类型语言,变量在声明时就必须指定数据类型。但是,有些场景下程序员无法确定类型,例如:在集合类中存储对象时,使用Object类型无法满足需求,会导致类型转换错误和代码可读性差。针对这种情况,Java提供了泛型机制,使得程序员可以在编译时期指定具体类型。
泛型语法
Java的泛型使用尖括号<>表示,例如:ArrayList
// 泛型类
public class MyGenericClass<T> {
private T myGenericField;
public T getMyGenericField() {
return myGenericField;
}
public void setMyGenericField(T myGenericField) {
this.myGenericField = myGenericField;
}
}
// 泛型接口
public interface MyGenericInterface<T> {
void doSomething(T t);
}
// 泛型方法
public class MyGenericMethod {
public <T> T genericMethod(T t) {
return t;
}
}
- 泛型类:通过定义一个类型变量T,可以在类中使用该类型变量代表任意类型。
- 泛型接口:与泛型类类似,用于定义接口的泛型类型。
- 泛型方法:可以在方法调用时,根据传递的参数类型决定具体的类型。
类型通配符
使用类型通配符(?)来表示不确定的类型。例如:
List<?> list = new ArrayList<String>();
- ? 代表着未知类型,与Object类似;
- List<?> 表示可以接收任意类型的List引用变量,也就是说,list可以指向任意类型的List引用变量。
类型通配符主要用于读取集合元素,如:
List<?> list = new ArrayList<String>();
for (Object o : list) { // 编译不报错
System.out.println(o);
}
由于list的元素类型未知,因此无法使用具体的类型作为元素变量的类型。
类型上限
Java中可以在通配符后面设置上限,用来限制通配符类型的范围。例如:
public static <E extends Number> void test(List<E> list){
// 方法体
}
上面的代码中定义了一个方法test,该方法接受的List中元素的类型必须是Number及其子类。例如:
List<Integer> intList = new ArrayList<Integer>();
test(intList); // 可以调用
List<String> strList = new ArrayList<String>();
test(strList); // 编译报错
上限的通配符语法为:<? extends 上限类型>,表示该通配符代表的类型为上限类型或其子类。
类型下限
Java中下限通配符语法为 <? super 下限类型>,其中,下限类型通常是当前类型的父类或自身。使用下限通配符可以向集合中添加元素。
public static void test(List<? super Integer> list, Integer a) {
list.add(a);
}
上面的代码定义了一个方法test,该方法接受的List中元素的类型必须是Integer或其父类。例如:
List<Number> numberList = new ArrayList<>();
test(numberList, 10); // 可以添加元素
示例1:无界泛型
无界泛型指使用时不指定类型参数的泛型,如List、Map。当未指定类型参数时,泛型将与普通的Collection或Map没有任何区别。例如:
List list = new ArrayList();
list.add("字符串");
list.add(10);
由于未指定类型参数,因此可以添加任意类型的元素。
示例2:泛型方法
泛型方法指在调用方法时传递具体类型参数的方法。例如:
public static <T> List<T> getList(T t) {
List<T> list = new ArrayList<>();
list.add(t);
return list;
}
getList是一个泛型方法,在调用时必须传递具体类型参数。例如:
List<String> stringList = getList("字符串A");
List<Integer> intList = getList(10);
总结
本文主要讲解了Java中的泛型机制。泛型可以在编译时期强制类型检查,提高代码的可读性和可维护性。泛型语法包括泛型类、泛型接口、泛型方法以及类型通配符等。同时,还介绍了类型上限、类型下限的使用方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:半小时通透Java的泛型 - Python技术站