java替换字符串的问号_⼈⽣靠反省,Java靠泛型
昨天有同事问 UrService、XxxService 都会调⽤ Dao 的 inrt、update ... ...,这些重复的代码,有没有办法变得灵活⼀些?
巧了,和咱们分享的主题刚好碰上,卖个关⼦,先不谈解决⽅案,就当啥事没有发⽣,重新引⼊今天的话题(捂嘴笑)。
想蜕变的研发⼈员,偶尔会品味⼀下 Java 的源码;久经职场的码农,时不时也会搭建⼀下项⽬架构。其实⽆论你是刚⼊猿门,还是⾻灰级战神,今天的分享你多多少少都听过、关注过、迷茫过甚⾄⽤过。电子商务师培训
xoyo
好了,准备好⼩板凳,让我们⼀起聊聊,在你看源码、搭架构过程中都躲避不开的 Java 中那些 E、T、?等字母都是啥意思?
先科普⼀下知识,什么是泛型?聊啥概念,直接上代码,直奔主题,先从 JDK 1.8 摘点源码出来,⼀起与泛型打个照⾯,混个脸熟。1.
啥是 E?
E 可以说在 JDK 源码中⽆处不在,咱们就从 ArrayList 的源码进⾏聊起。
decleor
public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { /** * Appends the specified element to the en 这个 E 在此处⽤来创建与初始 ArrayList 的类型,其实我们可以把它换成实际的类型,举个栗⼦:
发现编译器会把 E 被真正的类型所取代,其实也就是当我们创建出 ArrayList,那么对应的 add() 会变成 add(String e);当我们创建出ArrayList,那么对应的 add() 会变成 add(Dog e)。
但是往往⼀不留神你会这么写,其实你也不想这么写,程序猿⼼⾥的苦,其实说也说不清楚(捂嘴笑)。
这就说明了为什么写代码的时候,⽼是经常编译不过去,⽼是有警告,谁让咱定义的是 String 类型,⽽咱们⼜⾮要往集合中放⼊⼀条狗呢。
allege
来⾃灵魂的拷问:只能⽤“E”来表⽰吗?(⾝边同事还真问过我这个问题,在这我还是再认真的回答⼀次)
其实我们可以使⽤任何合法的 Java 标识字符串,但是⼤家⽤单⼀的字母来表⽰,已经成为⼀种习惯,⽽ E ⼜代表 Element 元素的意思,所以在集合中经常⽤ E 来表⽰,但是源码中⼤概率会碰到字母 T。
2.
啥是 T?
public static > void sort(List list) { list.sort(null);}
上⾯代码摘⾃ JDK 1.8 Collections 的源码,我们发现了“T”,⽽且还有“?”,问号咱们暂且放⼀边,着重聊⼀聊“T”。
分两部分去看,其中第⼀部分 指的是 T 必须是 Comparable 的实现(这是重点、这是重点、这是重点);第⼆部分⽅法⼊参 sort(List list),指的是仅能传⼊继承 Comparable 的参数化类型的 list。
其实也很难理解,不妨再摘个栗⼦配合理解。
从 JDK 1.8 源码中摘出 String 的源码,把 String 代⼊ Collections 的 sort ⽅法,替换为 T 尝试悟⼀下,看看是否 ok?!变量替换数学中⼤家都学过,就不深⼊了。
但是你实际开发中,有没有遇到过上图的情形,在进⾏狗狗列表排序时,就死活报错!报错!!原因就是因为要排序的狗狗,必须要实现Comparable,⽅能进⾏排序。
好了,T 就不再聊了,咱们还是说说这个问号吧。
3.
“?”问号是啥?
问号,看到这个估计会⼀脸懵逼,其实就是未知,代表⼀万种可能性,在 Java 中就是万⽤字符。
那我们再看看上⾯摘⾃ JDK 1.8 Collections 的源码,那么 Comparable super T> 则代表 Comparable 的类型参数必须是 T 或 T 的⽗型,你可能有迷糊了,还是再抛点代码吧。
herlf
看到效果了没,因为要针对狗狗排序,排序的类型必须是 Dog 或者是 Dog 的⽗类型,咱们传⼊ String 类型,当然是编译不通过啦,不妨改成 Dog 或者 Object ⾃⼰试⼀下,看看效果,在此不做演⽰。不过结论还是要说⼀下:Comparable super T> 则代表 Comparable 的类型参数必须是 T 或 T 的⽗类型。
提到 super T>,那不得不再提⼀提 extends T>,其实只要上⾯的搞明⽩了,这个也就⾮常清晰了,问号代表继承和实现 T,栗⼦就不抛了,在框架源码中遇到知道是啥意思就⾏了。
4.
五年级英语下册
七夕节快乐英文lei任性的总结。
其实泛型是编译期的⼀种检查,能够有效防⽌狗⼊⼈海,其中主要分为使⽤泛型的类以及使⽤泛型的⽅法;其中 E 主要⽤于集合的元素,除
了 E 之外绝⼤部分是 T,然后 Java 还引⼊了⼀种万⽤字符是问号,不过可以⽤任意 Java 有效标识符进⾏表⽰,不要再纠结、不要再纠
尹民秀结、不要再纠结。
说了这么多,咱们开篇的问题还没有解决啊?话不多说,直接抛代码,不懂也没关系,注意理解上⾯⼏个字母就⾏了,下⾯这段代码分享给
voiceofamerica需要的朋友(哎呦我去,⼜出来个字母 D)。
@Transactional(readOnly = true)public abstract class CrudService, T extends DataEntity> extends BaService { /** * 持久层对象 */ @Autowired protected D dao
5.
好了,今天分享就到这⼉吧,希望能够解你所惑;希望能在你前进的道路上,帮你披荆斩棘。如果感觉有点帮助,欢迎在看、秒赞,疯狂分
享转发,因为你的每⼀次分享,我都认真当成了⿎励与喜欢。