scala隐式转换不起作用

时间:2018-06-09 12:11:13

标签: scala implicit-conversion implicit implicits

我发现了一个奇怪的现象:

class A {
  val dual: A = this
  object T {
    implicit def doubleDual(t: T): dual.dual.T = t.asInstanceOf[dual.dual.T]
    implicit def justForTest(t: T): Int = 777
  }
  class T
}
val a = new A
val t = new a.T
// import a.T._
val x: Int = t //this works!
val t1: a.dual.dual.T = t //this doesn't work!

根据隐式搜索规则,应该应用doubleDual中的方法object T。但它并没有。我必须手动导入a.T._。为什么呢?

2 个答案:

答案 0 :(得分:1)

  

根据隐式搜索规则,应该应用对象T中的doubleDual方法。

在我看来,搜索应该找到两个含义:a.T.doubleDuala.dual.dual.T.doubleDual问题是它为什么不给出“隐式转换不是适用,因为它们含糊不清“错误。也许是因为他们有相同的名字?

不,那是错的,a.dual.dual.T.doubleDual的类型错误。但我仍然怀疑问题可能与搜索Ta.T时出现两次的a.dual.dual.T对象有关。这只是一个编译器错误,除非我错过了别的东西。

答案 1 :(得分:0)

关键是"同名"!

class A {
  val dual: A = this
  object T {
    implicit def doubleDual(t: T): dual.dual.T = t.asInstanceOf[dual.dual.T]
  }
  class T
}
val a = new A
val t = new a.T
import a.T.doubleDual  //
import a.dual.dual.T.doubleDual  //the same name!
val t1: a.dual.dual.T = t // won't compile

但重命名后:

import a.T.doubleDual  //
import a.dual.dual.T.{doubleDual => dd}  // different name!
val t1: a.dual.dual.T = t // can compile