Java代码规范之泛型通配符使用
目录
该条规范是什么
该规范建议在Java编程中,使用泛型通配符来接收返回的数据时,可以使用<? extends T>
来限制元素类型的上界,但此写法的泛型集合不能使用add
方法。而对于<? super T>
通配符,则不能使用get
方法。这样做可以避免在使用泛型时出现错误。
为什么这么规定
以下是该规范的原因:
- 类型安全性:通过使用泛型通配符限制元素类型的上界或下界,可以增强代码的类型安全性,防止将不符合预期类型的元素添加到集合中。
- 避免错误操作:使用
<? extends T>
通配符表示只能读取元素,不能添加元素;使用<? super T>
通配符表示只能添加元素,不能读取元素,可以避免在接口调用和赋值时出现错误操作。
多种主要用法及其代码示例
使用<? extends T>
通配符来接收数据
import java.util.ArrayList;
import java.util.List;
public class GenericExample {
public static void main(String[] args) {
List<? extends Number> numbers = new ArrayList<>();
// 不能添加元素,只能读取
// numbers.add(10); // 编译错误
// 可以读取元素
Number number = numbers.get(0);
}
}
使用<? super T>
通配符来插入数据
import java.util.ArrayList;
import java.util.List;
public class GenericExample {
public static void main(String[] args) {
List<? super Integer> integers = new ArrayList<>();
// 可以添加元素
integers.add(10);
// 不能读取元素
// Integer value = integers.get(0); // 编译错误
}
}
其他类似规范
- 在使用泛型时,遵循PECS(Producer Extends Consumer Super)原则。即,如果方法参数需要生产者(返回值),则使用
<? extends T>
;如果方法参数需要消费者(写入值),则使用<? super T>
。
详细区别
使用<? extends T>
和<? super T>
的区别如下:
<? extends T>
:表示通配符上界,可以读取元素但无法添加元素。适合于需要频繁从集合中读取元素的情况。<? super T>
:表示通配符下界,可以添加元素但无法读取元素。适合于需要频繁向集合中插入元素的情况。