Java泛型之上、下界通配符的理解(适合初学)
泛型的由来
为什么需要泛型
Java的数据类型一般都是在定义时就需要确定,这种强制的好处就是类型安全,不会出现像弄一个ClassCastException的数据给jvm,数据安全那么执行的class就会很稳定。但是假如说我不知道这个参数要传什么类型的,因为公司需求在变,如果写死的那就只能便以此需求就改一次,很麻烦。sun公司也注意到这个问题,这样会让代码的灵活性降低,他们就研究出了泛型。
泛型初识
什么是泛型,可以字面理解就是一个泛泛的类型,他是不确定的,在Java代码编译的时候用泛型是不会出错的,而在运行期时就会报错,说你这种第一是不合理的。这是为什么呢。因为为了提高灵活性,就在编译时期将条件放宽,但是泛型一定要在运行的时候告诉jvm你给我的数据到底是什么类型的,否则jvm会是懵逼的。所以泛型的好处就是将类型的灵活性提高,也只是在Java语法的基础上提高,不过泛型还是比较实用的。
何时使用泛型
泛型的应用场景就是应用在模型(可以理解为存储数据的盒子),我为了这个盒子适用更多的地方我就用将需要存入的数据用一个泛型表示,当然可以传入多值。如果是相同类型的对象就用一个泛型的数组比较好,学过集合的小伙伴应该都知道,没学过的那你应该补补课了。
泛型的语法
public class A<T extends B>{
T t;
}
泛型的缺点或者为什么需要上、下边界
泛型的虽然强大,但是世界上任何东西东部是完美的。它也有缺陷。比如说我有一个盒子我想装苹果,但是我还可能想装香蕉那怎么办。那还不好说,在给一个参数不就行了,那十个呢,二十个呢。em....的确是。如果说我们想装的东西都属于一个类并且只要是这个类的子类就可以装。这个想法sun为我们想好了。那就是用上边界通配符。语法是 T是泛型,M是T的父类。我们就定义一个水果类(Fruit),盛装就容器就是盘子(Dish),现在我们就可以装任何水果了,不错吧!
上边界Java代码
public class Dish<T extends Fruit>{
private T fruitChild;
public Dish(T fruitChild){
this.fruitChild = fruitChild;
}
public T getFruitChild(){
return fruitChild;
}
public void setFruitChild(T f){
this.fruitChild = f;
}
public static void main(String[] args){
Dish dish = new Dish<apple>();
Apple apple = new apple(); //apple must be Fruit child;
dish.setFruitChild(apple);
system.out.printf(dish.getFruitChild);
}
}
下边界Java代码
public class Dish<T super Apple>{
private T appleFather;
public Dish(T appleFather){
this.appleFather = appleFather;
}
public T getAppleFather(){
return appleFather;
}
public void setAppleFather(T f){
this.appleFather = f;
}
public static void main(String[] args){
Dish dish = new Dish<Fruit>();
Fruit fruit = new Fruit(); //fruit must be apple son;
dish.setAppleFather(fruit);
system.out.printf(dish.getAppleFather);
}
}
什么是上边界通配符
当泛型T给定形如 的A类型到A类型任何子类的限制域,可以匹配任何在此限制域中的类型,此种表示叫上边界通配符。
上边界通配符理解

什么是下边界通配符
当泛型T给定形如 的A类型到A类型任何父类的限制域,可以匹配任何在此限制域中的类型,此种表示叫下边界通配符。
下边界通配符理解

上下边界通配符的缺点
上界<? extends T>不能往里存,只能往外取。
解释
因为编译器只知道传入的是T的子类,但具体是哪一个编译器不知道,他只标注了一个占位符,当?传过来时,他不知道这能不能和占位符匹配,所以set不了。
下界<? super T>不影响往里存,但往外取只能放在Object对象里。
解释
因为下边界已经限制了?的粒度,他只可能是T本身或者是T的父类。我们想想,我想要一个T,你却返回给我一个比T小的Object,这样我们就因为精度损失而拿不到想要的数据了。
感谢各位童鞋的阅读,希望大家动一动发财的小手点一下推荐QAQ。
Java泛型之上、下界通配符的理解(适合初学)的更多相关文章
- Java泛型中的通配符T,E,K,V
Java泛型中的通配符T,E,K,V 1.泛型的好处 2.泛型中的通配符 2.1 T,E,K,V,? 2.2 ?无界通配符 2.3 上界通配符 < ? extends E> 2.4 下界通 ...
- Java泛型中的通配符
Java泛型中的通配符可以直接定义泛型类型的参数.而不用把该函数定义成泛型函数. public class GenericsTest { public static void main(String[ ...
- Java 泛型中的通配符
本文内容如下: 1. 什么是类型擦除 2.常用的 ?, T, E, K, V, N的含义 3.上界通配符 < ?extends E> 4.下界通配符 < ?super E> 5 ...
- JAVA 泛型中的通配符 T,E,K,V,?
前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...
- 【转】聊一聊-JAVA 泛型中的通配符 T,E,K,V,?
原文:https://juejin.im/post/5d5789d26fb9a06ad0056bd9 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型 ...
- Java泛型二:通配符的使用
原文地址http://blog.csdn.net/lonelyroamer/article/details/7927212 通配符有三种: 1.无限定通配符 形式<?> 2.上边界限定 ...
- 关于JAVA泛型中的通配符类型
之前对JAVA一知半解时就拿起weiss的数据结构开始看,大部分数据结构实现都是采取通配符的思想,好处不言而喻. 首先建立两个类employee和manager,继承关系如下.其次Pair类是一个简单 ...
- Java泛型(T)与通配符?
前言:使用泛型的目的是利用Java编译机制,在编译过程中帮我们检测代码中不规范的有可能导致程序错误的代码.例如,我们都知道list容器可以持有任何类型的数据,所以我们可以把String类型和Integ ...
- Java泛型中的通配符的使用
package com.srie.testjava; import java.util.ArrayList; import java.util.List; public class TestClass ...
随机推荐
- F#周报2019年第45期
新闻 邀请博客主们:2019年的F# Advent日历 宣告ML.NET 1.4 .NET Core与Jupyter笔记本 在Jupyter笔记本中使用ML.NET 用于Windows桌面的.NET ...
- AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层
AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层 AutoCad 二次开发 .net 之层表的增加 删除 修改图层颜色 遍历 设置当前层我理解的图层的作用大概是把 ...
- python经典面试算法题4.1:如何找出数组中唯一的重复元素
本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. [百度面试题] 难度系数:⭐⭐⭐ 考察频率:⭐⭐⭐⭐ 题目描述 ...
- python经典算法题目:找出这两个有序数组的中位数
题目:找出这两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以 ...
- python中字符串常见操作(二)
# 可迭代对象有:字典,列表,元组,字符串,集合 str1 = '192.168.1.1' str2 = 'as df gh jk' str3 = '小李子' str4 = ['aa','bb','c ...
- hdu 2444 The Accomodation of Students (判断二分图,最大匹配)
The Accomodation of StudentsTime Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- django_2:模板
使用模板变量: 在html文件中,{{title}}即为模板变量, 在view.py文件中,render函数,增加第三个参数,以字典形式给值. def index(req): return rende ...
- 在lldb调试中调用c++函数 - 如何使用QuartzCore里面的日志消息
承接上一篇,上一篇讲到可以在lldb调试中调用QuartzCore.framework里的CA::Render::Object::show方法来是观察CA::Render模块内的类的信息,但是在lld ...
- Docker基础与实战,看这一篇就够了
docker 基础 什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Uni ...
- Git的使用和基本概念理解
参考:https://www.liaoxuefeng.com/wiki/896043488029600 一).git的使用: 1.创建版本库(Resopsitory),相当于一个目录,目录中所有的文件 ...