如何定义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]
但它不允许编译
答案 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。