4

данные:Неявные преобразования для членов, которые являются типы

implicit class WithRetType[T, U](x: T => U) { 
    type Ret = U 
} 

это:

val foo = (_: Int) * 2 
val x: foo.Ret = 3 

Урожайность:

error: type Ret is not a member of Int => Int 
val x: foo.Ret = ??? 
     ^

следующие однако работы:

val foo = (_: Int) * 2 
val fooR = new WithRetType(foo) 
val x: fooR.Ret = 3 

Не подразумеваемые преобразования для доступа к членам, которые являются типами?

+0

Это, по-видимому, соответствующий исходный код: https://github.com/scala/scala/blob/2.11.x/src/compiler/scala/tools/nsc/typechecker/Implicits.scala, но требуется время, чтобы плуг через него :) – Ashalynd

+0

Я предполагаю, что это средство не работает на уровне декларации типа. – Ashalynd

+0

Я попытался взглянуть на ссылку, но там, где я мог найти это ограничение. Выглядит мне ошибка. – Jatin

ответ

1

Неявные преобразования не могут использоваться для доступа к членам типа. Независимо от деталей реализации, это можно рассматривать как логическое следствие из двух элементов в спецификации:

  • путь, что приводит к траектории в зависимости от типа должен иметь только стабильные элементов (Paths в спецификации)
  • неявного преобразование метод/функция, результат которого всегда нестабильный

Эти два несовместимые: вы не можете иметь неявный Конверси на пути, ведущем к зависящему от пути типу, потому что само преобразование нестабильно, делая путь недействительным.

Смежные вопросы