think in java 泛型
曾几何时,我们对java的泛型充满了好奇,但是感觉用起来有很爽,但又会在spring类型泛型的地方,遇到问题。
我第一次的遇到泛型是在使用别人的BaseDao的时候,这是一个java封装hibernate框架的操作数据库的工具。但我使用
的时候,只需要简单指定我需要数据库操作的类即可,非常方便,但是当我使用spring,想要对泛型的BaseDao<B>使用
@Autowired,根据类型注入的时候,spring却给我找到了一个错,我觉得很奇怪,在我看来BaseDao就是一个新的类型,
最起码他跟原来的BaseDao<A> 是有区别的,为什么spring不能识别出来。
在一脸蒙蔽的状态下,一直保留到现在,知道看了think in java的泛型,这一章,才了解了泛型的基础内容,学习三原则
what,why,how
1什么是泛型?
泛型是参数化类型。将类型作为参数,从而可以多种类型复用,
2.为什么出现泛型?
最初希望能够写出通用性更高的方法,我们使用object,因为
java的单根继承,所有东西都是object的子类,所有最初我们使用object来保存对象,达到了通用的目的,但是却有在编译时期,我们
可能将多种类型放进去,但是在拿出来类型转化时,转成了另外一种类型,这样只有在运行时,才能发现问题所在。
然后有想到了类,针对某一个类A,如果要使用当前的容器,则需要继承这个类A,达到不能乱放的目的,但是java是单根继承,当
原来就已经继承了某一个类的时候,就无法继承当前的类A。
接口可能,又会比类更加的方便,避免了继承问题。但终归来说,这些都是面向具体的类,获取面向具体的接口的类,但是我们希望
能够应用于不确定的对象,这个时候,泛型这个把 类型作为参数的东西就出来了,将要使用的对象作为参数。
3.怎么使用泛型?
泛型的使用非常简单,比如BaseDao的例子,BaseDao<T>,我们想要BaseDao<Student>,就将这个泛型应用于了Student这个对象,BaseDao<Teacher>
则应用到了Teacher身上,我们从BaseDao的方法取出实际对象,也是我们制定的Student,Theacher。看起来他们已经完全的变化了,它们好像是有区别的,它们
认识自己是什么类型。
但是!为什么spring对泛型的注入@AutoWired 这种根据类型的注入的方式却会报错呢?它们明明表面上是两个不同的东西,
我跟你说一件事情,java的泛型是‘伪’泛型!!!
或者说叫擦出泛型。如果想要知道原因,获取其中的故事,评论过5条,则发下一期。
think in java 泛型的更多相关文章
- Java泛型的历史
为什么Java泛型会有当前的缺陷? 之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗? 事实上,在Java1.5在200 ...
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- Java:泛型基础
泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...
- java泛型基础
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法. Ja ...
- 使用java泛型设计通用方法
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...
- 关于Java泛型的使用
在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Wind ...
- 初识java泛型
1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型 ...
- 【Java心得总结四】Java泛型下——万恶的擦除
一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...
- 【Java心得总结三】Java泛型上——初识泛型
一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...
- 初识Java泛型以及桥接方法
泛型的由来 在编写程序时,可能会有这样的需求:容器类,比如java中常见的list等.为了使容器可以保存多种类型的数据,需要编写多种容器类,每一个容器类中规定好了可以操作的数据类型.此时可能会有Int ...
随机推荐
- Error:(949) Multiple substitutions specified in non-positional format; Android格式化string.xml
string.xml问题代码 <string name="msg">书名:%s\n价格:%d</string> 异常信息 Error:(949) Multi ...
- [leetcode] #279 Perfect Squares (medium)
原题链接 题意: 给一个非整数,算出其最少可以由几个完全平方数组成(1,4,9,16……) 思路: 可以得到一个状态转移方程 dp[i] = min(dp[i], dp[i - j * j] + ) ...
- Quartus ii调试技巧_01
前几天李主任跟我分享了一些特别好用的调试技巧: 1)System Sources and Probes Editor---类似于人为设置触发条件,创建虚拟按键等功能,这段时间一直在做一个电机的驱动,板 ...
- windows无法执行 git reset head^版本回退操作的正确打开方式
^是cmd.exe的escape字符,属于特殊字符,命令里要用到文字 ^ 时必须用双引号把它夹起来,因此只要如下就可以正确执行: git reset head"^"或者git re ...
- HTML结构 语义化思想
总体思想:用正确的标签做正确的事情! 根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析. 主要体现: 1. 对用户而言, ...
- 【JDK】JDK源码分析-AbstractQueuedSynchronizer(3)
概述 前文「JDK源码分析-AbstractQueuedSynchronizer(2)」分析了 AQS 在独占模式下获取资源的流程,本文分析共享模式下的相关操作. 其实二者的操作大部分是类似的,理解了 ...
- JS和C#.NET获取客户端IP
我们经常在项目中会遇到这种需要获取客户端真实IP的需求,其实在网上也能随便就能查到各种获取的方法,我也是在网上查了加上了自己的实践,说一下自己在实践后的感受,基本上网上大部分都是用JS的方法来获取客户 ...
- CodeGlance右侧窗口缩略图消失不见
说明下问题,idea中的CodeGlance插件会在右侧显示缩略图,可以快速定位代码.今天遇到个问题升级了插件后右侧窗口消失.经过卸载插件,重启,reset一系列操作后还是没能恢复. 能去搜索引擎搜索 ...
- pipreqs 生成requirements.txt文件时编码错误问题
1,首先安装pipreqs --> pip install pipreqs 2.生成相应项目的路径 --> pipreqs e:\a\b 在此时可能会遇见 UnicodeDecodeE ...
- [转载]windows下mongodb安装与使用整理
windows下mongodb安装与使用整理 一.首先安装mongodb 1.下载地址:http://www.mongodb.org/downloads 2.解压缩到自己想要安装的目录,比如d:\mo ...