params
如何将通配符用于更高类型的类型?
无论class Toto[F[_]]()
val totos: Seq[Toto[_]] = Seq(new Toto[Future[_]], new Toto[IO[_]])
<console>:12: error: _$1 takes no type parameters, expected: one
val totos: Seq[Toto[_]] = ???
^
是什么,我只想要一个Seq
或Toto
。
答案 0 :(得分:2)
如果您可以将Toto
更改为协变,则可以执行以下操作:
import language.higherKinds
class Toto[+F[_]]()
class Foo[X]
class Bar[X]
val toto: Toto[F] forSome { type F[X] } = new Toto[Foo]
val totos = Seq[Toto[F] forSome { type F[X] }](new Toto[Foo], new Toto[Bar])
感觉类似于this one。
如果这种情况在您的代码中更经常发生,您还可以考虑通过将F
转换为Toto
的类型成员而将其移开:
import language.higherKinds
class Toto {
type F[X]
}
object Toto {
def empty[A[X]]: Toto = new Toto {
type F[X] = A[X]
}
}
class Foo[X]
class Bar[X]
val totos: Seq[Toto] = Seq(Toto.empty[Foo], Toto.empty[Bar])