繁体   English   中英

如何在Scala中声明变量参数抽象函数

[英]How to declare variable argument abstract function in Scala

我试图在采用可变数量参数的trait中声明函数,并且在实现trait期间,我将扩展参数的数量。 如何在Scala中完成

我期望拿出下面的代码。

trait Column {
  def rule
}

case object FirstColumn extends Column{
 def rule(s: String) : String
}

case object SecondColumn extends Column{
 def rule(s1: String, s2: String) : String
}

我尝试使用Strings *,但是在执行过程中不允许我扩展参数数量。 我知道有多种方法可以解决此问题,但我特别希望拥有上述签名供我的团队编写函数。

这主要是针对我对这个问题的评论。 这个答案可以使您尽可能地接近Scala所需要的内容,但这也说明了为什么做自己的工作可能不是一个好主意。

您可以表达(接近)您想要的类型,但是我不确定您打算获得什么。 首先,如果要采用其他arglist类型,则Column必须是通用的。

trait Column[-A] {
  def rule(arg: A): String
}

然后,我们可以将您的案例对象实现为对此的适当参数化的子类。

case object FirstColumn extends Column[String] {
  def rule(arg: String): String =
    "stub implementation"
}

case object SecondColumn extends Column[(String, String)] {
  def rule(arg: (String, String)): String =
    "stub implementation"
}

请注意, FirstColumnSecondColumn 不能从相同的Column[A]继承,因为它们没有实现相同的方法。 我们可以使它们具有共同的类型,但是……不是一种非常有用的方式。

一种选择是找到Column[String]Column[(String, String)]的公共超类型,这(因为参数是互变量的)类似于找到String(String, String)的公共子类型。 最接近的常见子类型是... Null 除非您仅打算将null传递给您的rule否则这无济于事。

相反,我们可以使用存在性。

val foo: Column[_] = FirstColumn
val bar: Column[_] = SecondColumn

现在,我们丢失了所有类型信息。 您可以访问 foo.rule插槽并可以打印它,但是您不能调用它,因为我们不知道传递它需要什么。 您必须进行强制转换才能将其恢复为可用格式。

是,我要说的是,这是可行的,但是一旦您丢失了尽可能多的类型信息,就没有多大意义了。 类型系统正确地告诉我们foobar实际上没有任何共同之处,只是存在一个名为rule的方法,该方法需要某种参数。 从类型理论的角度来看,很难做到比这更有趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM