gpt4 book ai didi

scala - 在 Scala 中约束更高级的类型

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

说我有一个更高级的类型

SuperMap[Key[_],Value[_]]`.  

现在假设我有一些更具体的东西需要 Key 的类型参数。必须匹配 Value ;也就是说,类似于:
SuperDuperMap[T, Key[T], Value[T]]

进一步假设我不想要任何 T , 但一个非常具体的地方 T <: OtherT
SuperDuperPooperMap[T <: OtherT, Key[T], Value[T]]

这可以在 Scala 中完成吗?这通常是一个坏主意吗?有没有更容易读/写/使用的等效方法?

最佳答案

您的声明已经按预期工作,即您限制了 T 的类型以及 KeyValue .但是,按照您编写的方式,如果您发出类似的问题,scala 会提示

scala> class Foo[T <: OtherT, Key[T], Value[T]]
defined class Foo

scala> new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]
<console>:13: error: Key[SpecialOtherT] takes no type parameters, expected: one
new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]

因为两者的类型 KeyValue你以前的声明已经给出了。因此这将起作用
scala> new Foo[SpecialOtherT, Key, Value]
res20: Foo[SpecialOtherT,Key,Value] = Foo@3dc6a6fd

这可能不是你想要的。你可以这样做
scala> class Foo[T <: OtherT, K <: Key[T], V <: Value[T]]
defined class Foo

scala> new Foo[SpecialOtherT, Key[SpecialOtherT], Value[SpecialOtherT]]
res21: Foo[SpecialOtherT,Key[SpecialOtherT],Value[SpecialOtherT]] = Foo@7110506e

归根结底,因为 Key 的类型和 Value完全依赖 T在使用 Foo 时,拥有所有这些冗余信息有点多余。 .那么为什么不使用像这样的内部类型声明:
class Foo[T <: OtherT] {
type K = Key[T]
type V = Value[T]
}

然后你就可以访问类型 KV在类中,但不需要每次创建新答案时都输入:
scala> new Foo[SpecialOtherT]
res23: Foo[SpecialOtherT] = Foo@17055e90

scala> new Foo[Int]
<console>:11: error: ...

关于scala - 在 Scala 中约束更高级的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9188376/

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