Java为什么要有泛型?
java里的泛型是奇葩的存在。这也是我经常怼java的一个原因。
先说下泛型的主要作用:
1,强化类型安全,比如定义了一个List<String>,那么里面只能存放String,不允许存放其他类型(派生自String的除外)。类型安全应该在编译和运行时都能体现。
2,提高性能,减少类型转换和装箱拆箱次数。
再说下java泛型奇葩之处:
1,java泛型实现的原理叫类型擦除,不管代码中怎么定义泛型,编译后都变成object, 因此不能实现运行时的类型安全。 而且java编译器不够聪明,可以很容易骗过去。 举个例子,你调用了第三方的接口返回List<String>,但实际拿到的值里面可能跟String没有半毛钱关系。
2,既然类型被擦除,那么类型转换就不可避免了,因此使用泛型和非泛型在性能上没有任何变化。
人吃任何东西的过程都一样,只是可吃的东西各种各样:把东西放进嘴里,在嘴里把东西用牙齿嚼碎,舌头和唾液搅拌下咽下去。有了泛型就可以用带了表示东西的这个泛型参数的人表达这个场景。这个泛型参数是水果,就是人吃水果。这个泛型参数是饭,就是人吃饭。这个泛型参数是菜,就是人吃菜。好处就是同一个人就可复用吃。
泛型即根据传入的参数不同返回不同的类型,比如返回给前端的是一个具体内容对象,我们就可以定义为泛型即具体内容可以传入不同的对象。
泛型的定义可以把某一相似的属性来接收不同的值。
往Java泛型类中方法传一个对象引用的参数,但是该方法的参数为什么不能调用该对象的方法?
有可能是你定义泛型的时候,定义的是<T>,这样的话,并不知道具体的T是哪一个类型,会被默认为object;
如果你传了一个Test对象,这个对象中有个test方法,你想调用这个方法,但是object中是没有这个方法的,就会报错。
你可以在定义泛型的时候,定义为<T extends Test>,这样只要传入一个Test的子类对象,就可以调用test方法。