Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 具有公共签名的推广方法_Scala - Fatal编程技术网

Scala 具有公共签名的推广方法

Scala 具有公共签名的推广方法,scala,Scala,我有以下几种方法 def functionOne(param1: String, param2: Int): ReturnTypeOne = { doSomethingWith(param1, param2, new ReturnTypeOne) } def functionTwo(param1: String, param2: Int): ReturnTypeTwo = { doSomethingWith(param1, param2, new ReturnTypeTwo) } ..

我有以下几种方法

def functionOne(param1: String, param2: Int): ReturnTypeOne = {
  doSomethingWith(param1, param2, new ReturnTypeOne)
}

def functionTwo(param1: String, param2: Int): ReturnTypeTwo = {
  doSomethingWith(param1, param2, new ReturnTypeTwo)
}
.....
def functionN(param1: String, param2: Int): ReturnTypeN = {
  doSomethingWith(param1, param2, new ReturnTypeN) 
}
有没有办法在Scala中推广这些方法?有什么建议吗?

也许可以将他们分组:

def functions (param1: String, param2: Int) = new {
  def one: ReturnTypeOne = ???
  def two: ReturnTypeTwo = ???
  def n: ReturnTypeN = ???
}

...
functions("a", 4).one

functions("b", 7).two
也许可以将他们分组:

def functions (param1: String, param2: Int) = new {
  def one: ReturnTypeOne = ???
  def two: ReturnTypeTwo = ???
  def n: ReturnTypeN = ???
}

...
functions("a", 4).one

functions("b", 7).two
不太清楚“概括”是什么意思。也许是这样的

trait F[A] {
  def f(x: String, y: Int): A
}

object F {
  def f[A](x: String, y: Int)(implicit ev: F[A]) = ev.f(x, y)

  implicit object FInt extends F[Int] {
    def f(x: String, y: Int) = y
  }

  implicit object FString extends F[String] {
    def f(x: String, y: Int) = x
  }
}

import F._

f[Int]("123", 1) //> 1
f[String]("123", 1) //> "123"
不太清楚“概括”是什么意思。也许是这样的

trait F[A] {
  def f(x: String, y: Int): A
}

object F {
  def f[A](x: String, y: Int)(implicit ev: F[A]) = ev.f(x, y)

  implicit object FInt extends F[Int] {
    def f(x: String, y: Int) = y
  }

  implicit object FString extends F[String] {
    def f(x: String, y: Int) = x
  }
}

import F._

f[Int]("123", 1) //> 1
f[String]("123", 1) //> "123"


为什么不将1,2,…n作为参数传递给函数?根据它们的作用进行泛化?在这种情况下,我们希望看到这些方法的定义。因此,
doSomethingWith()
的第三个参数也是该方法的返回类型?既然
doSomethingWith()
做了你需要的一切,为什么还要使用
functionX()
呢?@jwvh这是在包装器里面的,所以我必须使用这个类为什么你不把一,二,…n作为参数传递给你的函数呢?根据它们的作用进行泛化?在这种情况下,我们希望看到这些方法的定义。因此,
doSomethingWith()
的第三个参数也是该方法的返回类型?既然
doSomethingWith()
做了你需要的一切,为什么还要使用
functionX()
?@jwvh这是在包装器中,所以我必须使用这个类你想每次调用
one
都实例化一个新对象吗?听起来对我来说太浪费了。@VictorMoroz也许。。。不知道目的就不能说。。。过早的优化等等……您想在每次调用
一个
时实例化一个新对象吗?听起来对我来说太浪费了。@VictorMoroz也许。。。不知道目的就不能说。。。过早优化等等……我也想将返回类型作为参数传递,这样我就只有一个函数
val firstVal=myFunction(“q”,1,ReturnTypeOne)
val secondVal=myFunction(“a”,2,ReturnTypeTwo)
那么Victor的答案就是你想要的。@aƞjiβ你不能真正将类型作为方法参数传递,类型不是对象。但是你可以像我的例子一样使用类型多态性。@VictorMoroz可能是我没有解释清楚。我已经更新了问题以显示我当前的实现。我也想将返回类型作为参数传递,这样我只有一个函数
val firstVal=myFunction(“q”,1,ReturnTypeOne)
val secondVal=myFunction(“a”,2,ReturnTypeTwo)
那么Victor的答案就是你想要的。@aƞjiβ你不能将类型作为方法参数传递,类型不是对象。但是你可以像我的例子一样使用类型多态性。@VictorMoroz可能是我没有解释清楚。我已经更新了问题以显示我当前的实现。