如何隐式转换为具有同名方法的类

用户79074

假设我使用隐式转换定义了以下类:

abstract class Holder[K, V] {
    var map = Map[K, V]()
    def key(v: V): K
    def get(v: V) = map.get(key(v))
}

implicit def toMap[K, V](holder: Holder[K, V]): Map[K, V] = holder.map

我尝试这样使用它:

val holder = new Holder[Long, String] {
    def key(str: String) = str.toLong
}

holder.get("3")
toMap(holder).get(3)
holder.get(3)

由于无法解析隐式转换,编译将在最后一行失败。我猜这是因为类 Holder 已经包含方法 get()。有没有办法实现到具有相同命名方法的类的隐式转换?

乔克

您可以“强制”进行隐式转换,或者使其更加明确,如下所示:

implicit class ImplicitApplicator[A](a: A) {
  def as[B](implicit conv: A => B): B = conv(a)
}

那么你可以这样做:

holder.as[Map[Long, String]].get(3)

否则,我认为没有办法解决名称冲突。这是隐式转换的基本限制之一。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有Num类型类的实例如何隐式强制转换为小数?

当类依赖于隐式时,是否有惯用的方法将类转换为对象?

具有值类的Scala隐式转换和mkNumericOps

如何防止将隐式转换为具有多种整数类型的boost :: variant类型?

Scala中具有隐式函数的转换与隐式类之间的区别

隐式类vs隐式转换为特征

方法的两个具有相同名称的隐式定义

当接口具有多个通用参数时,如何解决“无法将[类型]隐式转换为[接口]”错误?

具有隐式转换的Scala映射

派生类的智能指针如何隐式转换为基类?

导入与类中方法同名的隐式值时隐式解析失败

具有函数curring的reduc vs非隐式方法中的scala隐式类方法类型不匹配

Seq [(Int,Int)],具有null的隐式转换为DataFrame

为什么 std::function 可以隐式转换为具有更多参数的 std::function ?

使用在显示模板中具有隐式转换为已声明的@model的模型

调用带有隐式转换为模板类对象的参数的函数

(GCC错误?)隐式转换为派生类

Linq ToDictionary不会将类隐式转换为接口

强制隐式转换为最通用的共享类?

隐式将整数转换为类'BigInt'

与IQueryable方法有关的问题(无法将类型'long?'隐式转换为'long'

为什么隐式值类具有额外的方法调用?

如何获得有关隐式转换为较低精度的警告?

如何解决JSON解析错误:“没有将String隐式转换为Integrer”?

将类方法转换为具有后备字段的属性

如何将此列表转换为R中具有相同名称的数据框?

如何将具有不同名称的列的宽格式转换为长格式?

当Typescript检查经典JS类时,如何解决“'this'隐式具有类型'any'”

从A隐式转换为Some(a)