gpt4 book ai didi

scala - 在 trait 中定义 scala 上下文绑定(bind)的简写

转载 作者:行者123 更新时间:2023-12-05 09:20:34 28 4
gpt4 key购买 nike

在 scala 抽象类中,如果你想定义一个上下文绑定(bind),你可以简单地使用,例如[T: ClassTag] 在参数中,但这在特征中是不可能的:

trait Foo[T: ClassTag]

Error:(11, 35) traits cannot have type parameters with context bounds `: ...' nor view bounds `<% ...'
trait Foo[T: ClassTag]
^

如果你定义:

trait Foo[T] {

implicit def ctg: ClassTag[T] = implicitly[ClassTag[T]]
}

object Bar extends Foo[Int]

然后任何在 Bar 中读取 ctg 的尝试都会触发 StackOverflowError,因为隐式参数变为尾递归。

那么,允许在自动将子类暴露给上下文绑定(bind)的特征中定义 ctg 的最佳方法是什么?

最佳答案

没有好的方法。上下文绑定(bind)是隐式参数的简写,特征没有参数。也就是说,当你写:

 class Foo[T : ClasTag]

编译器将您的代码去糖化以:

 class Foo[T](implicit ev: ClassTag[T])

当然,这对于 trait 是不可能的。如果您必须使用特征来解决这个问题,您可以使 ClassTag 抽象,并强制扩展它的类来实现它:

trait Foo[T] {
implicit def ctg: ClassTag[T]
}

object Bar extends Foo[Int] {
implicit val ctg = classTag[Int]
}

这看起来略微更好,中间有一个类,因此您不需要在定义 Bar 时指定两次 Int:

trait Foo[T] {
implicit def ctg: ClassTag[T]
}

class FooImpl[T](implicit val ctg: ClassTag[T]) extends Foo[T]

object Bar extends FooImpl[Int]

关于scala - 在 trait 中定义 scala 上下文绑定(bind)的简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37265045/

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