泛型是一种在编程语言中使用的概念,它允许我们编写可以适用于多种数据类型的代码。通过使用泛型,我们可以编写更加通用和灵活的代码,提高代码的重用性和可维护性。
在Java中,泛型使用尖括号<>来表示,我们可以在类、接口、方法的定义中使用泛型。例如,我们可以定义一个泛型类如下:
public class MyGenericClass<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
在上面的例子中,T
是一个类型参数,它可以在类的内部表示任意类型。我们可以在创建对象时指定具体的类型,例如:
MyGenericClass<Integer> myInt = new MyGenericClass<>();
myInt.setValue(10);
System.out.println(myInt.getValue()); // 输出 10
MyGenericClass<String> myString = new MyGenericClass<>();
myString.setValue("Hello");
System.out.println(myString.getValue()); // 输出 "Hello"
通过使用泛型,我们可以在编译时进行类型检查,避免了在运行时出现类型转换错误的问题。同时,泛型还可以提供更好的代码可读性和安全性。
然而,当方法的参数为List<?>
时,它并不适用于List<Integer>
这样的具体类型。这是因为List<?>
表示一个未知类型的列表,我们无法确定具体的类型参数。在使用List<?>
作为方法参数时,我们只能对列表进行读取操作,而无法进行写入操作。
如果我们希望能够对列表进行写入操作,可以使用通配符上限List<? extends T>
,其中T
是一个具体的类型。例如,如果我们希望方法参数可以接受List<Integer>
和List<Number>
,可以这样定义方法:
public void processList(List<? extends Number> list) {
// 对列表进行读取操作
for (Number num : list) {
System.out.println(num);
}
// 无法进行写入操作,编译报错
// list.add(10);
}
在上面的例子中,List<? extends Number>
表示一个可以接受任意继承自Number
的列表。我们可以对列表进行读取操作,但无法进行写入操作,因为编译器无法确定具体的类型。
总结一下,泛型是一种在编程语言中使用的概念,它允许我们编写可以适用于多种数据类型的代码。在Java中,我们可以使用泛型来提高代码的重用性和可维护性。当方法参数为List<?>
时,它表示一个未知类型的列表,只能进行读取操作。如果需要进行写入操作,可以使用通配符上限List<? extends T>
。
领取专属 10元无门槛券
手把手带您无忧上云