scala中trait和abstract class在隐式转换中的区别
说半天还不如看一点代码更清楚问题之所在:
object ImplicitObject3 { def main(args: Array[String]): Unit = { def sum[A](xs:List[A])(implicit st:SubTemplate[A]):A = { if(xs.isEmpty) st.unit else st.add(xs.head,sum(xs.tail)) } implicit object SubTemplateImplicitIntValue extends SubTemplate[Int] { override def unit: Int = 0 override def add(x: Int, y: Int): Int = x + y } implicit object SubTemplateImplicitStringVlaue extends SubTemplate[String] { override def unit: String = "" override def add(x: String, y: String): String = x + y } println(sum(List(1,2,3,4,5))) println(sum(List("abc","efg","hijk"))) } } trait Template[A] { def add(x:A,y:A):A } trait SubTemplate[A] extends Template[A] { def unit:A }
编译正确,执行时:在类加载器加载时出现异常。但是将二个trait放在object ImplicitObject3中,不管是放在main的前面还是后面都执行OK:
object ImplicitObject3 { trait Template[A] { def add(x:A,y:A):A } trait SubTemplate[A] extends Template[A] { def unit:A } def main(args: Array[String]): Unit = { def sum[A](xs:List[A])(implicit st:SubTemplate[A]):A = { if(xs.isEmpty) st.unit else st.add(xs.head,sum(xs.tail)) } implicit object SubTemplateImplicitIntValue extends SubTemplate[Int] { override def unit: Int = 0 override def add(x: Int, y: Int): Int = x + y } implicit object SubTemplateImplicitStringVlaue extends SubTemplate[String] { override def unit: String = "" override def add(x: String, y: String): String = x + y } println(sum(List(1,2,3,4,5))) println(sum(List("abc","efg","hijk"))) } }
如果将二个trait改为abstract class形式,定义在object ImplicitObject3之外执行也OK:
object ImplicitObject3 { def main(args: Array[String]): Unit = { def sum[A](xs:List[A])(implicit st:SubTemplate[A]):A = { if(xs.isEmpty) st.unit else st.add(xs.head,sum(xs.tail)) } implicit object SubTemplateImplicitIntValue extends SubTemplate[Int] { override def unit: Int = 0 override def add(x: Int, y: Int): Int = x + y } implicit object SubTemplateImplicitStringVlaue extends SubTemplate[String] { override def unit: String = "" override def add(x: String, y: String): String = x + y } println(sum(List(1,2,3,4,5))) println(sum(List("abc","efg","hijk"))) } } abstract class Template[A] { def add(x:A,y:A):A } abstract class SubTemplate[A] extends Template[A] { def unit:A }
为什么会有这样的现象,原因是什么呢???????????????????????
当我在object ImplicitObject3外面定义二个trait之外,还在二个trait同级定义了一个继承自SubTemplate[A]的abstract class类,同时将main中二个implicit object继承的父改为这个抽象类,则一切都OK了。这种情况下,实验OK,其实原因好理解:
object ImplicitObject3 { def main(args: Array[String]): Unit = { def sum[A](xs:List[A])(implicit st:SubTemplate[A]):A = { if(xs.isEmpty) st.unit else st.add(xs.head,sum(xs.tail)) } implicit object SubTemplateImplicitIntValue extends abstractTemplate[Int] { override def unit: Int = 0 override def add(x: Int, y: Int): Int = x + y } implicit object SubTemplateImplicitStringVlaue extends abstractTemplate[String] { override def unit: String = "" override def add(x: String, y: String): String = x + y } println(sum(List(1,2,3,4,5))) println(sum(List("abc","efg","hijk"))) } } trait Template[A] { def add(x:A,y:A):A } trait SubTemplate[A] extends Template[A] { def unit:A } abstract class abstractTemplate[A] extends SubTemplate[A]
有一次无意中,我将二个trait放在另一个单独的scala文件中,然后我编译工程然后调试,不成功。鬼使神差地在main的最开头import SubTemplate一次,居然成功了。我将磁盘上所有class文件都删除了再编译工程却又不成功。然后再去掉import,单独编译那个scala文件,再编译工程却又成功执行代码了。总结来看:这是由于IDEA造成class文件与源代码不一致的原因

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
TcaplusDB君 · 行业新闻汇编(6月9日)
TcaplusDB君一直密切关注着游戏行业和数据库行业的动态。以下是TcaplusDB君收集的近期的游戏行业和数据库行业的新闻,汇编整理,献给大家观看。 (本篇文章部分内容来自网络) 2021中国数据库行业研究报告发布 近日,艾瑞咨询发布《中国数据库行业研究报告2021年》。 报告指出,从20世纪80年代起,我国数据库市场开始逐步发展起来。经历了初始的技术萌芽期和国外厂商垄断期,21世纪初,基于863计划、核高基计划等国家政策支持,一批拥有高校背景的国产厂商成立,打破了Oracle和IBM一统天下的格局。 数据来源:艾瑞咨询 2020年游戏行业进入高速增长期:6家公司营收超百亿 近期,游戏上市公司陆续发布了2020年年报。 《2020年中国游戏产业报告》显示,2020年,我国游戏用户规模逾6.6亿人,中国游戏市场实际销售收入2786.87亿元,同比增长20.71%,增速同比提高13.05%。“游戏出海”规模进一步扩大,自主研发游戏在海外市场的实际销售收入154.50亿美元,同比增长33.25%,增速同比提高12.3%,国际化水平进一步提升。 新冠肺炎疫情影响下,2020年上半年,“宅经...
- 下一篇
毕昇 JDK:为啥是ARM 上超好用的 JDK
摘要:毕昇 JDK 是华为基于 OpenJDK 定制的开源版本,是一款高性能、可用于生产环境的 OpenJDK 发行版。 本文分享自华为云社区《【云驻共创】毕昇 JDK:“传奇再现”华为如何打造 ARM 上最好用的 JDK?》,原文作者:白鹿第一帅。 前言 不知道大家是否听说过亦或是使用过毕昇 JDK,是否从事 Java 工作?是否从事 JVM 底层开发?绝大多数 Java 开发者使用的都是 Oracle 的 JDK 或者是 OpenJDK,本文我们将介绍华为的毕昇 JDK 以及我们所做的相关技术优化,希望能在除上述两者之外提供给大家新的选择。 一、什么是毕昇 JDK? 1.1、毕昇 JDK 发展历程 毕昇 JDK 是华为基于 OpenJDK 定制的开源版本,是一款高性能、可用于生产环境的 OpenJDK 发行版。稳定运行在华为内部 500 多个产品上,在华为内部广泛使用毕昇 JDK,团队积累了丰富的开发经验,解决了实际业务运行中遇到的多个疑难问题。如 crash 等相关问题,我们已经在内部解决。 1.2、毕昇 JDK 的支持架构 目前仅支持 Linux/AArch64 架构。欢迎广...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合Thymeleaf,官方推荐html解决方案