源码中接口实现方法为什么实参与形参类型不一样不一样?有错吗求解释求解

编程:JAVA里面据说接口不能有实现方法体,为什么我查看API源代码的时候发现有的接口的某些方法是有方法体的?这是怎么回事?比如图中的一个方法是Collection接口的一个方法:def

你那是抽象类吧,,,,

那是api源代码里面的collection接口啊, 你可以打开你的java源代码看一下,肯定也有这一段。连声明都是interface collection,怎么可能是抽象类呢

我的是,貌似我听说是新出来的一特性, 但是搞不懂它为什么可以有方法体,你尝试找找看最新版的的api文档,里面应该就有这个方法了,我在网上查了很久,都说没见过这样的

里面是有那个方法,看不到方法里面的,,哎

对对,这个方法是有实现代码的, 方法体的内容就是我上面贴的那个图里面的代码。我无意中发现还有别的接口也有类似的带实现的方法,大神,加分求解呀~

这是jdk8中的新特性,每一个接口中可以添加一个非抽象的方法实现,但必须加关键字default

版权声明:本文为博主原创文章,未经博主允许不得转载。 /gjm/article/details/

1, controller如果能保持单例,尽量使用单例,这样可以减少创建对象和回收对象的开销.也就是说,如果
 controller的类变量和实例变量可以以方法形参声明的尽量以方法的形参声明,不要以类变量和实例变量声明,
 这样可以避免线程安全问题.
 文件获取方法参数名的过程.即便springmvc对读取出的方法参数名进行了缓存,如果不要读取class文件当然
3, 阅读源码的过程中,发现springmvc并没有对处理url的方法进行缓存,也就是说每次都要根据请求url去匹配
 controller中的方法url,如果把url和method的关系缓存起来,会不会带来性能上的提升呢?有点恶心的是,负
 类增强代码,必须要改代码后重新编译.当然,如果缓存起来,必须要考虑缓存的线程安全问题.

本文实例讲述了Java泛型定义与用法。分享给大家供大家参考,具体如下:


  

这段代码很简单,将整形、字符串、对象放进list集合中,然后逐一取出。可以看出,由于List接口在定义时并不知道元素的类型,因此默认为Object,即任意类型元素进入list集合后都会自动装箱。而取值的过程更为复杂,所有取得的值都是装箱后的Object对象,必须得知道每一个元素的初始类型才能拆箱。一般使用集合的时候,集合的元素往往都是具有共同特征的,比如同属于一类的----那么,如果一开始限定了list集合元素的类型,那么就可避免上述不规范操作。代码如下,


  

如此一来,便有了泛型集合的说法。实际上,查阅List接口的Api会发现,List接口正是泛型接口,它可以接受一个类型参数E,若不传递参数,则默认是Object类型。

2. 泛型类型的继承关系

有如下功能的代码,实现打印任意集合的元素:


  

很明显,意思就是传递的参数类型不匹配。难道String不是继承自Object的吗?没错,String是继承自Object的,但是List<String>List<Object>是截然不同的两个类型,两者之间没有任何继承关系。那如果真的要实现上面的功能,该如何呢?

 // 打印任意集合元素

程序正常执行,这里的?表示一个未知类型,这个未知类型与Object不同,List<?>代表了所有的List<类型>的父类。

不只有通配符可以解决泛型继承的问题,若将上面的方法定义为泛型方法也具有同样的效果:

 // 打印任意集合元素

泛型方法的定义形式如下,

其中<T,E>在修饰符的后面做为类型定义,为方法指明形参中需要用到的T,E类型是来自哪里。既然泛型方法和类型通配符都可以实现泛型中的继承,那么有什么区别?

2.3 泛型方法和通配符的区别

 // 打印任意集合元素

上述泛型方法在定义T,E时已经指明了关系:T是E的子类,所以在传递参数的时候,T要么是E的子类,要么就是E本身,所以在传递关系不小心变为E exends T时,在第三次调用方法时报错了。而如果把上述代码换成?通配符的话,则不具有如此强的限定关系。

总之,泛型方法和?通配符都可以实现未知类型的继承,但是泛型方法主要强调多个未知类型之间的依赖关系。如果只是单纯用作成为一个通用类型的父类这一功能的话,两者都可以实现,反而?通配符较为简洁明了。

2.4 泛型参数上、下限的注意

 // 复制集合并返回原始集合的最后一个元素

当调用完copy方法后,系统比对发现T类型为Number,?类型为Integer。所以函数返回的T类型是Number了,所以根本不兼容Integer。要修改上面的代码,有俩个办法,


  

分析代码可以得出,?为T的子类,在方法中T=lastElement这句表现为多态,虽然返回的是T类型,但是多态的表现为?类型,即Interger类型,调用lastElement.getClass()也可发现返回的是java.lang.Integer类型,说明此处编译类型为T类型,实际运行类型为?类型。这就好比如下多态转换,


  

虽然f的多态表现为子类Child,但是上面一句连语法检测都过不了。这也就是为什么上面Integer不能兼容Number的原因了。

 

这样一来,?类型变为了父类,T类型变为了子类,于是在方法中返回的T类型对象,即lastElement就不具有多态性了。泛型中的上下限是很有学问的,每次看源码时都会琢磨很久,但还是会在浩瀚的接口+泛型的设计中昏迷,这种设计真的完全是为了突出面向对象的特性,以后慢慢琢磨吧。

从这也再次可以看出?通配符在处理具有依赖关系的泛型方法中,显得过于灵活而会导致一些潜在的隐患。

更多关于java算法相关内容感兴趣的读者可查看本站专题:《》、《》、《》和《》

希望本文所述对大家java程序设计有所帮助。

我要回帖

更多关于 实参与形参类型不一样 的文章

 

随机推荐