曾几何时, 我们对 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 条, 则发下一期.
来源: https://www.cnblogs.com/wangchaodong/p/11421059.html