如何定义scala方法的上界

时间:2017-04-18 13:15:44

标签: scala

如何定义Scala方法,以便在不抛出编译错误的情况下接受任何类型A的子类?

trait A
case class B extends A
case class C extends A
case class W[T](abc: Option[T]= None)

def methodOne(a: A): W[A] = {
  a match {
     case b:B => methodTwo() // throws compilation error
     case c:C => methodThree() // throws compilation error
  } 
}
def methodTwo(): W[B] = y
def methodThree(): W[C] = z

尝试了类似

的内容
def methodOne[T <: A](a: A): W[T]

但它不允许编译

2 个答案:

答案 0 :(得分:2)

您需要W协变。您可以通过将其定义为W[+T]

来轻松完成此操作
case class W[+T](abc: Option[T] = None)

这种情况如果B是[{1}}的子类型,A也是W[B]的子类型。

例如,

W[A]定义为Option,因此Option[+T]Option[B]的子类型。

您可以结帐the official scala docs了解更多详情

答案 1 :(得分:2)

如果您希望forall library(tidyverse) df1 %>% group_by(group) %>% summarise(value = list(fft(x))) %>% unnest() 暗示T <: A,则需要W[T] <: W[A]协变:

W

有关差异的基本情况,请参阅this post