有没有办法在 Scala 中为泛型类型变量设置默认值?

bar*_*ara 5 scala

我想为变量设置一个默认值。但是我的 Scala 编译器说:

Error:(20, 16) unbound placeholder parameter
    val p: T = _
               ^
Run Code Online (Sandbox Code Playgroud)

这是代码。

object InverseFunctionsExample extends App {

  type D = Double

  def f(x: D): D = 5 * x + 10
  def g(x: D): D = 0.2 * x - 2

  printMessage(isInversible(f, g))

  def printMessage(inv: Boolean): Unit = {
    if (inv) print("YES!") else print("NOPE!")
  }

  def isInversible[T](f: (T) => T, g: (T) => T): Boolean = {
    val p: T = _
    if (f(p) == g(p))
      true
    else
      false
  }
}
Run Code Online (Sandbox Code Playgroud)

是否可以以val p某种方式使用默认值初始化 a ?

Ben*_*ich 1

您可以使用反射来实例化类的新实例,但这对您来说可能不是很有用:

class Foo
classOf[Foo].getConstructor().newInstance()
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读反射 API,了解如何选择合适的构造函数。

您还可以有一个参数来指定如何实例化新实例:

def isInversible[T](f: T => T, g: T => T, def: => T) = f(def) == g(def)
Run Code Online (Sandbox Code Playgroud)

由于这看起来像是一个本质上面向数学的问题,因此您可能会对类型感兴趣Numeric,这可以帮助促进针对不同数字类型的这种逻辑。例如:

def intersectAtOrigin[T](f: T => T, g: T => T)(implicit n: Numeric[T]) = {
    val zero = n.zero
    f(zero) == g(zero)
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

def f(x: D): D = 5 * x + 10
def g(x: D): D = 0.2 * x - 2
intersectAtOrigin(f, g) //false, working with Doubles
intersectAtOrigin[Int](_ + 1, x => x * x + x + 1) //true, working with Ints
Run Code Online (Sandbox Code Playgroud)

您可以在此处的Numeric文档中阅读更多相关信息。