ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java进阶篇01、泛型,献给真心想学Java的打工人

2021-09-10 12:30:09  阅读:163  来源: 互联网

标签:01 java Generic 进阶篇 Fruit 泛型 new Food setData


Generic foodGeneric2 = new Generic<>();
print2(foodGeneric2);

// 错误使用
// Generic appleGeneric2 = new Generic<>();
// print2(appleGeneric2);


### 二.通配符泛型对象的参数读取和修改

#### 1.使用`? extends Xxx`创建通配符泛型对象

Generic<? extends Fruit> generic = new Generic<>();
Fruit fruit1 = new Fruit();
Apple apple1 = new Apple();
Food food1 = new Food();
// generic.setData(fruit1);
// generic.setData(apple1);
// generic.setData(food1);
Fruit data1 = generic.getData();


上述代码分析:使用 `? extends Fruit` 规定了泛型上界为 Fruit,但是并不能确定泛型具体的类型,所以不能通过setData方法去修改任何类型的对象;但是可以通过getData方法确定获得对象类型为 Fruit ,因为java中向上类型转换是安全的,所以类型为Fruit肯定没有问题;所以用 `? extends Fruit` 规定的泛型对参数的读取是安全的,但是不能对参数进行修改。这是重点,需要掌握!

#### 2.使用`? super Fruit`创建通配符泛型对象

Generic<? super Fruit> generic2 = new Generic<>();
Fruit fruit2 = new Fruit();
Apple apple2 = new Apple();
Food food2 = new Food();
generic2.setData(fruit1);
generic2.setData(apple1);
// generic2.setData(food1);
Object data2 = generic2.getData();


上述代码分析:使用 `? super Fruit` 规定了泛型下界为Fruit,所以说里面存取的元素是Fruit或者是Fruit的父类,所以我们在setData方法中可以传入Fruit或者是Fruit子类的对象,同样可以理解为向上转型是安全的;但是不能传入 Food 类型的对象,因为我们只能确定元素是 Fruit 或者是 Fruit 的父类,但是并不能确切的确认是哪一个父类,所以不能传 Food 类对象。同理getData方法只能确定取出的元素是Fruit或者是Fruit的父类,但是并不能确认是哪个父类,又因为Object是所有类的父类,所以用Object接受肯定是没有问题的。这是重点,需要掌握!

#### 3.使用 `?` 创建通配符泛型对象

Generic<?> generic3 = new Generic<>();
Fruit fruit3 = new Fruit();
Apple apple3 = new Apple();
Food food3 = new Food();
// generic3.setData(fruit1);
// generic3.setData(apple1);
// generic3.setData(food1);
Object data3 = generic3.getData();


上述代码分析:这种情况我们可以认为 `?` 通配符没有进行限制,所以不能用setData方法操作任何对象,又因为Object是所有类的父类,所以使用 Object 接受是没问题的。

#### 4.使用`? extends Xxx`创建通配符泛型对象使用分析

List list0 = new ArrayList<>();
list0.add(100);
List<? extends Number> list = new LinkedList<>(list0);
// list.add(10);
Integer number = (Integer) list.get(0);
System.out.println(number);


上述代码分析,根据上面情况1对 `? extends xxx` 的总结,可以直接得出list对象是参数读取安全的,但是不能进行参数修改。

#### 5.使用 `? super Xxx` 创建通配符泛型对象使用分析

List<? super Number> list2 = new LinkedList<>();
list2.add(10);

标签:01,java,Generic,进阶篇,Fruit,泛型,new,Food,setData
来源: https://blog.csdn.net/m0_60635084/article/details/120219506

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有