Java泛型是Java SE 5的一项新特性,用于解决类型安全问题和减少代码重复。通过使用泛型,可以在编译时捕获类型错误,并实现代码复用的目的。泛型主要体现在集合使用、自定义及继承和通配符的使用上。
Java泛型在集合使用上的体现
Java集合框架中的泛型被广泛地应用于ArrayList、LinkedList、HashSet、HashMap等类中。具体体现如下:
ArrayList的泛型使用示例
ArrayList<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
intList.add(3);
intList.add(4);
intList.add(5);
intList.add("six"); // 不能添加字符串类型,编译时就会报错
通过指定ArrayList的类型为Integer,我们保证了只能向ArrayList添加Integer类型的对象。试图向intList中添加一个字符串是非法的,编译时就会报错。
HashMap的泛型使用示例
HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
hashMap.put("one", 1);
hashMap.put("two", 2);
hashMap.put("three", 3);
hashMap.put("four", 4);
hashMap.put("five", 5);
hashMap.put("six", "6"); // 不能添加字符串类型,编译时就会报错
通过指定HashMap的类型为String和Integer,我们保证了只能向HashMap添加键为String,值为Integer类型的对象。试图向hashMap中添加一个键为字符串,值为字符串的元素是非法的,编译时就会报错。
Java泛型在自定义及继承上的体现
Java泛型不仅可以用于集合类,也可以用于自定义的类和其子类。具体体现如下:
class Box<T> {
private T data;
public Box(T data) { // 构造函数
this.data = data;
}
public T getData() { // 获取数据
return data;
}
public void setData(T data) { // 设置数据
this.data = data;
}
}
class StringBox extends Box<String> { // 子类继承父类时指定类型为String
public StringBox(String data) {
super(data);
}
}
在自定义的Box类中,我们使用了泛型类型T,表示在Box的实例化中可以用任意类型替换T。通过继承Box类,在子类StringBox中指定了类型为String,达到了更严格的类型约束。如果在StringBox中尝试添加非String类型的元素,编译时就会报错。
Java泛型通配符的使用
泛型通配符用于表示泛型类中的某个类型,但又不确定具体是哪种类型。在Java中,泛型通配符用问号(?)表示。具体体现如下:
泛型通配符上界示例
public static double sumOfList(List<? extends Number> list) {
double sum = 0.0;
for (Number n : list) {
sum += n.doubleValue();
}
return sum;
}
List<? extends Number>表示list中的元素是Number的子类或Number类型,可以传入List
泛型通配符下界示例
public static void addNumbers(List<? super Integer> list) {
list.add(1);
list.add(2);
list.add(3);
}
List<? super Integer>表示list中的元素是Integer的超类,可以传入List
通过使用泛型通配符,我们可以更加灵活地处理泛型类型,使得我们能够在不知道具体类型的情况下进行类型安全的编程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java泛型在集合使用与自定义及继承上的体现和通配符的使用 - Python技术站