gpt4 book ai didi

scala - 为什么这段 scala 代码不推断类型?

转载 作者:行者123 更新时间:2023-12-02 07:46:46 26 4
gpt4 key购买 nike

我正在使用一些如下所示的代码构建聚合框架

trait Aggregate[T <: Aggregate[T, K], K] { self: T =>
def plus(another: T): T

def show: K
}

我有几个这样的聚合,

case class Count(value: Long = 1) extends Aggregate[Count, Long] {
def plus(another: Count) = Count(value + another.value)

def show = value
}

一旦我定义了这样的聚合,

case class By[T <: Aggregate[T, K], K, G](values: HashMap[G, T]) extends Aggregate[By[T, K, G], Map[G, K]] {
override def plus(another: By[T, K, G]): By[T, K, G] = By(values.merged(another.values){case ((k1,v1), (k2,v2)) => (k1, v1 plus v2)})

override def show: Map[G, K] = values.map{case (k,v) => k -> v.show}
}

object By {
def apply[T <: Aggregate[T,K], K, G](key:G, value:T):By[T, K, G] = By(HashMap(key -> value))
}

我写不出这样的东西

By("key1", Count(100))

相反,我必须写这个

By[Count, Long, String]("key1", Count(100))

由于它没有弄清楚 Long 部分,我讨厌指定这些类型,是否有更干净的方法来实现这一点?

最佳答案

我学到的技巧:

object By {
def apply[T <: Aggregate[T,K], K, G](key:G, value:T with Aggregate[T,K]):By[T, K, G] = By(HashMap(key -> value))
}

with Aggregate[T,K] 细化以某种方式帮助编译器找出类型。

关于scala - 为什么这段 scala 代码不推断类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39418173/

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