2017-04-18 63 views
2

你如何定義一個Scala方法,使它能夠在不引發編譯錯誤的情況下接受任何類型A的子類?如何定義scala方法的上限

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

如果你想FORALL T <: A暗示W[T] <: W[A],你需要W協:

case class W[+T](abc: Option[T] = None) 

object X { 
    def methodOne(a: A): W[A] = { 
    a match { 
     case b: B => methodTwo() 
     case c: C => methodThree() 
    } 
    } 

    def methodTwo(): W[B] = ??? 
    def methodThree(): W[C] = ??? 
} 

方差的基本內容,請參閱this post

+0

謝謝!這工作... – Stanley

2

你需要讓W協變。您可以通過它定義爲W[+T]容易做到這一點:

case class W[+T](abc: Option[T] = None) 

這樣,如果BA一個亞型,W[B]也是W[A]亞型。

Option例如定義爲Option[+T],因此Option[B]Option[A]的子類型。

您可以檢出the official scala docs瞭解更多詳情

相關問題