在下面的示例中,我想知道為什么funPoly不能接受存在量化型別 value outersFromInnersEx,即使funEx可以。
case class InnerCassClass[I, E, O](i: I, e: E, o: O)
case class OuterCaseClass[I, E, O](inner: InnerCassClass[I, E, O])
val inner1 = InnerCassClass(5, "foo", 3.3f)
val inner2 = InnerCassClass(4.4f, 6, "bar")
// Doesn't work as expected due to invariance of type paramemters I, E, O (but confirm)
// val outersFromInnersAny: List[OuterCaseClass[Any, Any, Any]] = List(inner1, inner2).map(OuterCaseClass.apply)
val outersFromInnersEx: List[OuterCaseClass[_, _, _]] = List(inner1, inner2).map(OuterCaseClass.apply)
def funPoly[I, E, O](occ: List[OuterCaseClass[I, E, O]]): Unit = ()
def funEx(occ: List[OuterCaseClass[_, _, _]]): Unit = ()
// This doesn't work, but why?
val u1 = funPoly(outersFromInnersEx)
val u2 = funEx(outersFromInnersEx)
請注意,我在 Scala 3 中對此進行了測驗(在線嘗試),但在 Scala 2 中的問題在很大程度上是相同的,盡管這個特定示例在 Scala 2 中存在其他問題。
uj5u.com熱心網友回復:
請注意,這兩種是非常不同的型別:
def funPoly[I, E, O](occ: List[OuterCaseClass[I, E, O]]): Unit = ()
def funEx(occ: List[OuterCaseClass[_, _, _]]): Unit = ()
第一個能夠處理統一的OuterCaseClass物件串列,其中每個物件的型別引數都相同。第二個可以處理混合的OuterCaseClass物件串列,其中每個物件的型別引數(可能)不同。
使型別引數協變“修復”了問題,因為 thenList[OuterCaseClass[_, _, _]]等效于List[OuterCaseClass[Any, Any, Any]],并且您可以簡單地實體化funPolys 型別引數Any, Any, Any以使其接受任何funEx可以接受的內容。
一般來說,您可以將存在限定型別傳遞給多型函式。例如,這應該有效:
case class ListAndFunction[A](list: List[A], function: A => Int)
val a: ListAndFunction [_] = ListAndFunction[String](List("a"), _.length)
def mapFunction[A](a: ListAndFunction [A]): List[Int] =
a.list.map(a.function)
mapFunction(a)
uj5u.com熱心網友回復:
這是關于型別差異的,你可以funPoly通過改變來作業
case class InnerCassClass[I, E, O](i: I, e: E, o: O)
case class OuterCaseClass[I, E, O](inner: InnerCassClass[I, E, O])
到
case class InnerCassClass[ I, E, O](i: I, e: E, o: O)
case class OuterCaseClass[ I, E, O](inner: InnerCassClass[I, E, O])
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372701.html
