Scala 中的字符串伴随对象
String companion object in scala
给定一个具有 "converter" 的类型,我想在使用该类型的伴生对象的方法调用上进行自动转换。也就是说,给定以下定义,
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
编译吗?
不确定,你想完成什么,但以下对我有用
case class Converted(name: String)
trait Converter[A] {
def perform: Converted
}
implicit def toConverted(name: String) = Converted("String")
implicit def toIntConverted(int: Int) = Converted("Int")
def f(needsConverted: Converted): String = needsConverted.name
f("some")
f(5)
Can I make f(String) compile using implicits?
没有。当然,你可以定义一个名为 String
的值,但它与类型 String
.
无关
implicit toConverter[A: Converter](a: A.type): Converted =
implicitly[Converter[A]].perform
A
in A.type
必须是 value;它与类型参数 A
无关。
事实上,就Scala 的类型系统而言,class/trait 与其伴随对象之间没有任何关系。所以你不能做你想做的事情。
当然,如果你不坚持使用()
而不是[]
,它就变得微不足道了:
def f1[A: Converter] = f(implicitly[Converter[A]].perform)
f1[String]
f1[TheClass]
您可以为伴随类型 MyClass.type
.
定义隐式实例,而不是为类型 MyClass
定义隐式实例
implicit val TheClassConverter: Converter[MyClass.type] = new Converted[MyClass.type] {
def perform = Converted("MyClass")
}
给定一个具有 "converter" 的类型,我想在使用该类型的伴生对象的方法调用上进行自动转换。也就是说,给定以下定义,
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
编译吗?
不确定,你想完成什么,但以下对我有用
case class Converted(name: String)
trait Converter[A] {
def perform: Converted
}
implicit def toConverted(name: String) = Converted("String")
implicit def toIntConverted(int: Int) = Converted("Int")
def f(needsConverted: Converted): String = needsConverted.name
f("some")
f(5)
Can I make f(String) compile using implicits?
没有。当然,你可以定义一个名为 String
的值,但它与类型 String
.
implicit toConverter[A: Converter](a: A.type): Converted = implicitly[Converter[A]].perform
A
in A.type
必须是 value;它与类型参数 A
无关。
事实上,就Scala 的类型系统而言,class/trait 与其伴随对象之间没有任何关系。所以你不能做你想做的事情。
当然,如果你不坚持使用()
而不是[]
,它就变得微不足道了:
def f1[A: Converter] = f(implicitly[Converter[A]].perform)
f1[String]
f1[TheClass]
您可以为伴随类型 MyClass.type
.
MyClass
定义隐式实例
implicit val TheClassConverter: Converter[MyClass.type] = new Converted[MyClass.type] {
def perform = Converted("MyClass")
}