2

持つ

class A
class B extends A
class C extends A
class Container[+L <: HList](l: L)

次のようにコーディングする形のない方法は何ですか?:

def foo[L <: HList](a: A): Container[L] = a match {
  case (b: B) => new Container(1 :: "a" :: HNil)
  case (c: C) => new Container(1.0 :: HNil)
  case _ => new Container(HNil)
}

そして、それをある意味で使用するには:

val l1: Container[Int :: String :: HNil] = foo(new B)
val l2: Container[Double :: HNil] = foo(new C)
val l3: Container[String :: HNil] = foo(new C) // Compile-time error

Why `List[B]` is not a subtype of `Seq[L]` when `class B extends A` and `L <: A`? "。

4

2 に答える 2

0

最後に問題の本質を理解しました...次のように見えます:

implicit def fromA(a: A): Container[HNil] = new Container(HNil)
implicit def fromB(b: B): Container[Int :: String :: HNil] = new Container(1 :: "a" :: HNil)
implicit def fromC(c: C): Container[Double :: HNil] = new Container(1.0 :: HNil)

次に、次のように書く資格があります。

val l1: Container[Int :: String :: HNil] = new B
val l2: Container[Double :: HNil] = new C
// val l3: Container[String :: HNil] = new C // Compile-time error
val l4: Container[HNil] = new A

より良い解決策は大歓迎です。

于 2013-08-13T20:27:17.917 に答える