在java中,?代表通配符。
通配符用法 1. 在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义
2. <? extends Object>代表上边界限定通配符
3. <? super Object>代表下边界限定通配符。
上边界限定通配符 上边界通配符直接使用add()方法受限,但是可以用来获取各种数据类型的数据,并赋值给父类型的引用。 [Java] 纯文本查看 复制代码 ?
1 2 3 4 5 6 7 8 9 | List<? extends Number> list= null ; list= new ArrayList<Integer>(); list.add( new Integer( 1 )); //报错,因为list不能确定实例化的对象具体类型导致add()方法受限 ... list.get( 0 ); //正确 |
正确用法: [Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { firstPrint(); secondPrint(); } public static void firstPrint() { List<Float> list1 = new ArrayList<>(); //使用 Float作实参类型 list1.add( 12 .3f); list1.add( 23 .4f); print(list1); } public static void secondPrint() { List<Integer> list2 = new ArrayList<>(); //使用Integer作实参类型 list2.add( 1 ); list2.add( 2 ); list2.add( 3 ); print(list2); } public static void print(List<? extends Number> list) { // 通配符作形参 for ( int i = 0 ; i < list.size(); i++) { System.out.println(list.get(i)); // 使用get方法 } } } |
下边界限定通配符 下边界通配符使用get()方法受限(不使用强转),但是可以添加特定类型的值,用于将对象写入到一个数据结构里 [Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 | List<? super Integer> list = null ; list = new ArrayList<Number>(); list.add( 1 ); Number number = list.get( 0 ); //报错,因为List<? super Integer>不知道list存放的对象具体类型,则使用get获取到的值不确定。 ... list.add( 1 ); //正确 |
正确用法: [Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Number> list = new ArrayList<>(); firstInflate(list); for ( int i = 0 ; i < list.size(); i++) { System.out.println(list.get(i)); } list.clear(); secondInflate(list); for ( int i = 0 ; i < list.size(); i++) { System.out.println(list.get(i)); } } public static void firstInflate(List<? super Integer> list) { // 装填整数 list.add( 1 ); list.add( 2 ); list.add( 3 ); } public static void secondInflate(List<? super Float> list) { // 装填浮点数 list.add( 1 .1f); list.add( 2 .2f); list.add( 1 .3f); } } |
总结 列表内容 限定通配符总是包括自己 上界类型通配符:add方法受限 下界类型通配符:get方法受限 如果你想从一个数据类型里获取数据,使用 ? extends 通配符 如果你想把对象写入一个数据结构里,使用 ? super 通配符 如果你既想存,又想取,那就别用通配符 不能同时声明泛型通配符上界和下界 更多免费技术资料可关注:annalin1203 |