scala中trait和abstract class在隐式转换中的区别

说半天还不如看一点代码更清楚问题之所在:

object ImplicitObject3 {
def main(args: Array[String]): Unit = {
def sumA(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 sumA(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 sumA(implicit st:SubTemplate[A]):A = {www.rsxedu.com
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 {www.meimeitu8.com
def main(args: Array[String]): Unit = {
def sumA(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文件与源代码不一致的原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值