gpt4 book ai didi

scala - 我如何让 Scala 编译器从另一种类型推断出一种类型?

转载 作者:行者123 更新时间:2023-12-04 05:51:21 24 4
gpt4 key购买 nike

我想创建一个 Scala Id 类型类,以便,例如,我可以声明 Foo 类型的 Id 采用 Long 值,例如

val fooId: Id[Foo] = Id(12L) // type-safe at compile time
val fooIdValue: Long = fooId.value // able to get the value back out

我尝试了各种方法,但似乎无法强制执行这些约束。如果我声明
trait WithId[I] {
type Id = I
}

case class Id[A <: WithId[_]](value: A#Id) // A#Id => Any, not what I want!

class Foo extends WithId[Long] {
type Id = Long
}

这允许
val fooId: Id[Foo] = Id("foo") // should be illegal unless a Long

如果我将 WithId 更改为使用抽象类型
trait WithId {
type Id
}

case class Id[A <: WithId](value: A#Id)

class Foo extends WithId {
type Id = Long
}

然后
val fooId: Id[Foo] = Id(12L)

不编译,说
no type parameters for method apply: (value: A#Id)net.box.Id[A] in object Id exist so that it can be applied to arguments (Long)  --- because --- argument expression's type is not compatible with formal parameter type;  found   : Long  required: ?0A#Id

我怎么能说和强制一个 Id[Foo] 需要一个 Long?

最佳答案

WithId 上去掉那个类型参数是对的.然而,第二个问题是由你如何实例化你的 Id 引起的。 .当你说 val x: Foo[T] ,您正在指定所需的类型 x有,但你并没有真正帮助编译器弄清楚是什么类型 Foo应该在构建时使用。所以......你对 Foo 说的结果的编译器错误您想要的 IdA ,但你还没告诉Foo什么A甚至是!要修复它,只需将您的用法更改为

val fooId = Id[Foo](12L)

关于scala - 我如何让 Scala 编译器从另一种类型推断出一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com