通配符用法
1. 在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义
2. <? extends Object>代表上边界限定通配符
3. <? super Object>代表下边界限定通配符。
上边界限定通配符
上边界通配符直接使用add()方法受限,但是可以用来获取各种数据类型的数据,并赋值给父类型的引用。
List<? extends Number> list=null;
list=new ArrayList<Integer>();
list.add(new Integer(1));//报错,因为list不能确定实例化的对象具体类型导致add()方法受限
...
list.get(0);//正确
1 关于通配符和写入操作
/*
通配符的使用:?
1. G<?> 可以看做是G<A>的父类,可以体现多态性。其中A是任何一个类。
2. 向声明为通配符的集合中,写入数据: 不被允许的。
但是,唯一可以写入的值:null
*/
@Test
public void test1(){
ArrayList<Object> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
method(list1);
method(list2);
}
public void method(ArrayList<?> list) {
// list.add(123);
// list.add("AA");
//唯一可以写入的值:null
list.add(null);
}
2 读取操作
/*
3. 向声明为通配符的集合中,读取数据:允许的。
*/
@Test
public void test2(){
ArrayList<String> list2 = new ArrayList<>();
list2.add("AA");
list2.add("BB");
method1(list2);
}
public void method1(ArrayList<?> list) {
Iterator<?> iterator = list.iterator();
while(iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
}
3 有限制条件的通配符
/*
有限制条件的通配符的使用
*/
@Test
public void test3(){
List<Object> list1 = null;
List<Person> list2 = null;
List<Student> list3 = null;
//情况1:
List<?> list4 = null;
list4 = list1;
list4 = list2;
list4 = list3;
//对于list4来说,只能写入null,其他值不能写入。 支持数据的读取。
//情况2:可以接收Person类及Person类的子类的泛型类型
List<? extends Person> list5 = null;
// list5 = list1;//错误
list5 = list2;
list5 = list3;
//情况3:可以接收Person类及Person类的父类的泛型类型
List<? super Person> list6 = null;
list6 = list1;
list6 = list2;
// list6 = list3;//错误
}
@Test
public void test4(){
List<Student> list = new ArrayList<>();
list.add(new Student());
List<? extends Person> list5 = list;
//写入数据:只能写入null,其他值不可以。
list5.add(null);
// list5.add(new Student());
//读取数据:可以读取,读取的数据类型为Person
Person person = list5.get(0);
}
@Test
public void test5(){
List<Object> list = new ArrayList<>();
list.add(new Object());
List<? super Person> list5 = list;
//写入数据:可以写入Person及Person子类对象
list5.add(null);
list5.add(new Student());
list5.add(new Person());
// list5.add(new Object());//错误的
//读取数据:读取的数据类型为Object
Object obj = list5.get(0);
}
本文深入探讨了Java中的泛型通配符用法,包括无限制通配符、上边界限定通配符和下边界限定通配符。通过示例展示了它们在读写操作中的限制,以及在不同场景下的适用性。通配符的使用能提高代码的灵活性和安全性,但同时也需要谨慎处理写入操作以避免类型安全问题。

475

被折叠的 条评论
为什么被折叠?



