假如,现在定义一个表示坐标的类,Point,属性坐标x,y,但是此类设计特殊,现在由于设计特殊,现在实际使用中有可能出现以下三种结构的数据:
整数:x=10、y=10;
小数:x=10.1、y=10.1;
字符串:x=东经10度、y=北纬20度。
可以发现,Point中可以保存三种数据类型,而Point类中只存在xy两个属性。现在唯一可以想到的数据类型就是Object类型,因为满足以下转换:
保存int:int-》自动装箱为Integer-》向上转型为Object;
保存double:double-》自动装箱为Double-》向上转型为Object;
保存字符串:String-》向上转型为Object。
【第一步】:定义Point类
以上代码编译OK,但是项目运行时会发生错误:
以上分析可知,向下转型这种操作本身存在安全隐患问题,且不能通过编译检查出来,用Object类进行这类处理就说有这种问题。
那么该问题如何解决呢?唯一的解决方案就是不进行对象的向下转型。
这样的背景下,就产生了泛型的技术。
泛型的本质:类中的属性或方法的参数,不设置具体的类型,只使用一个标记表示,而在类使用的时候才对其动态的绑定一种数据类型。
【举例】:使用泛型
泛型类型可以改变,将以上使用的泛型类型由String 变为Integer,此时fun方法不能正常使用,且由于重载是受到参数类型而不是泛型类型的限制,那么无法通过重载来解决此问题。那么该如何解决,需要一种标记满足以下要求:
可以用于泛型上,这样可以避免安全警告;
标记使用后,允许接收任何内容,但是不能修改里面的数据;
为此,泛型中提供了一个重要的通配符“?”
【举例】:使用通配符描述
但是,此通配符基础上又扩展处理两个子通配符组合:
?extends 类:设置泛型的上限,可以设置在类或方法参数中;
?extends Number:表示可以使用的泛型只能是Number或者Number的子类;
?super 类:设置泛型的下限,可以设置在方法参数中:
?super String:表示只能够设置String或者其父类。
【举例】:设置泛型的上限(只能设置数字)
———————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有帮助,轻抬您发财的小手,
关注/评论/点赞/收藏
,就是对我最大的支持!
祝君升职加薪,鹏程万里!
文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。
原文链接:winter.blog.csdn.net/article/details/106061267