неявное преобразование scala не работает - PullRequest
0 голосов
/ 09 июня 2018

Я обнаружил странное явление:

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 голосов
/ 09 июня 2018

Ключ "одноименный"!

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
0 голосов
/ 09 июня 2018

Согласно неявному правилу поиска, должен применяться метод doubleDual в объекте T.

Мне кажется, что поиск должен найти two implicits: a.T.doubleDual и a.dual.dual.T.doubleDual Вопрос в том, почему он не дает «неявные преобразования не применимы, потому что они неоднозначны» ошибки.Может быть, потому что у них одинаковые имена?

Нет, это неправильно, a.dual.dual.T.doubleDual имеет неправильный тип.Но я все еще подозреваю, что проблема может быть связана с тем, что объект T появляется дважды при поиске a.T и a.dual.dual.T.Просто это будет ошибка компилятора, если я не пропущу что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...