标签: implicit-class

优化的隐式值类分组

我正在为现有的Java库编写一组隐式Scala包装类(这样我就可以装饰该库以使Scala开发人员更方便).

作为一个简单的例子,让我们说Java库(我无法修改)有一个类,如下所示:

public class Value<T> {
    // Etc.
    public void setValue(T newValue) {...}
    public T getValue() {...}
}
Run Code Online (Sandbox Code Playgroud)

现在让我们说我想用Scala风格的getter和setter 来装饰这个类.我可以使用以下隐式类来完成此操作:

final implicit class RichValue[T](private val v: Value[T])
extends AnyVal {
  // Etc.
  def value: T = v.getValue
  def value_=(newValue: T): Unit = v.setValue(newValue)
}
Run Code Online (Sandbox Code Playgroud)

implicit关键字告诉Scala编译器它可以将实例转换ValueRichValue隐式实例(前提是后者在范围内).所以现在我可以将其中定义的方法RichValue应用于实例Value.例如:

def increment(v: Value[Int]): Unit = {
  v.value = v.value + 1 …
Run Code Online (Sandbox Code Playgroud)

scala value-class implicit-class

10
推荐指数
1
解决办法
211
查看次数

创建类型敏感函数而不更改父特征或案例类

假设我有两个类PersonBusiness,它们由特质 扩展Entity

trait Entity
case class Person(name: String) extends Entity
case class Business(id: String) extends Entity
Run Code Online (Sandbox Code Playgroud)

假设我无法更改Entity,Person并且Business(它们位于不同的文件中并且不能更改),我如何定义一个函数,例如 a ,根据实体printEntity打印字段name或?id例如,给定Person和的实例Business,我该如何做这样的事情:

object Main extends App {
  val person1: Person = Person("Aaaa Bbbb")
  val business1: Business = Business("0001")
  
  // How can I do something like this?
  person1.printEntity // would call a function that executes println(id)
  business1.printEntity // would call a function …
Run Code Online (Sandbox Code Playgroud)

extension-methods scala class implicit implicit-class

2
推荐指数
1
解决办法
58
查看次数

Scala 从隐式类方法中选择了错误的隐式转换

当隐式类声明中发生转换时,编译器未能选择正确的隐式转换方法。在下面的示例中,我有一个Foo[T]类和一个隐式Helper类,它采用 aFoo并提供一个print方法。该 print 方法调用show,它本身是一个由 on 隐式转换提供的方法Foo

问题是有两种可能的转换提供show:一种转换Foo[T]为 a Bar[T],另一种转换Foo[Array[T]]为 a BarArray[T]。这个想法是,当我们有一个Foo包含数组的时候,我们想要应用更具体的BarArray转换。据我了解,编译器首先选择具有最具体类型的转换。

这在正常上下文中起作用,如下例所示,但print在隐式Helper类中的方法的上下文中中断。在那里,show调用了相同的方法,因此我希望应该应用相同的转换。然而,在这种情况下,编译器总是选择Bar转换,即使它有Foo[Array[T]]并且应该选择BarArray转换。

出了什么问题?

最小失败代码示例:

package scratch

import scala.language.implicitConversions

class Foo[T](val value: T) {}

object Foo {
  implicit def fooToBar[T](foo: Foo[T]): Bar[T] = {
    new Bar(foo.value)
  }

  implicit def fooArrayToBarArray[T](foo: Foo[Array[T]]): BarArray[T] = {
    new …
Run Code Online (Sandbox Code Playgroud)

generics scala implicit implicit-conversion implicit-class

1
推荐指数
1
解决办法
73
查看次数