Учитывая тип, который имеет «преобразователь», я хотел бы иметь автоматическое преобразование при вызове метода с использованием объекта-компаньона этого типа. То есть, учитывая следующее определение,
case class Converted(name: String)
trait Converter[A] {
def perform: Converted
}
implicit val StringConverter = new Converter[String] {
def perform = Converted("String")
}
заставить работать следующий код:
implicit def toConverter(a: String.type): Converted =
implicitly[Converter[String]].perform // Error: `Found String.type, required AnyRef`
def f(needsConverted: Converted) = ???
f(String) // <- That's what I would like to be able to write.
Но это не удается, и обе попытки преобразования терпят неудачу. Обратите внимание, что я не могу изменить f
, потому что он предоставляется сторонней библиотекой, а их много.
- Могу ли я компилировать
f(String)
с помощью имплицитов?
Если это невозможно для строк, как насчет классов, у которых есть объект-компаньон, могу ли я сделать это в общем случае, например:
object TheClass
case class TheClass()
implicit val TheClassConverter = new Converter[TheClass] {
def perform = Converted("TheClass")
}
implicit def toConverter[A: Converter](a: A.type): Converted =
implicitly[Converter[A]].perform // Error: `Not found value A`
implicit def toConverter(a: TheClass.type): Converted =
implicitly[Converter[TheClass]].perform // This works but is not generic
f(TheClass) // This works.
- Могу ли я сделать первый
toConverter
для компиляции?
implicit val TheClassConverter: Converter[TheClass.type] = ???
? - person Jasper-M   schedule 29.03.2017String
? - person Mikaël Mayer   schedule 29.03.2017String
. Мне просто нужно определитьobject String
... Если вы предоставите свой комментарий в качестве ответа, я могу его принять. - person Mikaël Mayer   schedule 29.03.2017Converter[A]
действительно не используетA
нигде в своем теле, почему у него есть параметр типа? Если это так, наличиеConverter[MyClass.type]
, когда вам нужноConverter[MyClass]
, не поможет. - person Alexey Romanov   schedule 30.03.2017A
в теле. - person Mikaël Mayer   schedule 30.03.2017