Java泛型之上界下界通配符详解
在Java泛型中,通配符是一个非常强大的概念。它可以让我们在类型参数定义中使用限制,以控制传递给泛型的参数类型。本篇攻略将会详细讲解Java泛型中通配符的上界和下界以及如何使用通配符实现灵活而精细的类型限制。
上界通配符
我们知道在Java泛型中我们可以使用限定符来对类型参数进行限定,被限定的类型参数必须继承自该限定符指定的上界类型。上界通配符使用的符号是 extends,特别地,如果没有指定上界通配符,则默认为上界为Object类型。
public <T extends Number> void test(T t) {
// 方法体
}
上述代码定义了一个方法,该方法定义了一个泛型类型T,限定T必须继承自Number类型。这个表示方式使得传递给test方法的参数必须是继承自Number类的类型,比如Integer、Float、Double等。
如果我们希望能够接受更宽泛的类型,则可以使用Object类型作为上界,例如:
public <T extends Object> void test(T t) {
// 方法体
}
这个表示方式意味着,传递给test方法的参数可以是任意类型。
下界通配符
在Java泛型中还存在下界通配符。下界通配符使用的符号是 super,它可以允许泛型类型参数的输入参数为该限定符指定的下界类型或其超类。
public <T super Number> void test(T t) {
// 方法体
}
上述代码使用了下界通配符,它指定了泛型类型参数T必须是Number类型或其子类。这个表示方式意味着,传递给test方法的参数可以是Number、Object类型。
示例说明
上界通配符示例
public class UpperBoundDemo {
public static void main(String[] args) {
List<? extends Number> list1 = new ArrayList<Integer>();
List<? extends Number> list2 = new ArrayList<Float>();
List<? extends Number> list3 = new ArrayList<Double>();
getData(list1);
getData(list2);
getData(list3);
// getData(new ArrayList<String>());编译错误,在getData方法中不能将String类型的list传递给参数list1、list2、list3
}
public static void getData(List<? extends Number> list) {
System.out.println("data: " + list.get(0));
}
}
上述代码定义了一个泛型方法getData,该方法接收一个泛型类型参数为List<? extends Number>。该泛型类型参数是一个上界通配符,表示接受任何继承自Number类型的List集合。
我们可以看出,在调用getData方法的时候,我们可以将值类型为Integer、Float、Double的List集合传递给该方法,但是不可以传递String类型的List集合给该方法。
下界通配符示例
public class LowerBoundDemo {
public static void main(String[] args) {
List<? super Integer> list1 = new ArrayList<Integer>();
List<? super Integer> list2 = new ArrayList<Number>();
List<? super Integer> list3 = new ArrayList<Object>();
setData(list1);
setData(list2);
setData(list3);
// setData(new ArrayList<Float>());编译错误,在setData方法中不能将Float类型的list传递给参数list1、list2、list3
}
public static void setData(List<? super Integer> list) {
list.add(new Integer(50));
}
}
上述代码定义了一个泛型方法setData,该方法接收一个泛型类型参数为List<? super Integer>。该泛型类型参数是一个下界通配符,表示接受Integer类型及其父类的List集合。
我们可以看出,在调用setData方法的时候,我们可以将值类型为Integer、Number、Object的List集合传递给该方法,但是不可以传递Float类型的List集合给该方法。
结论
在Java泛型的使用中,通配符是非常重要的概念,对于上界和下界的使用可以使得类型参数得到更加灵活、高效、安全的使用。同时在使用通配符的过程中需要注意类型参数的需要,以达到良好的代码可读性、可维护性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java泛型之上界下界通配符详解 - Python技术站