我可以声明一个扩展其自己的类型参数的装饰器类吗?

发布于 2024-10-28 00:11:26 字数 355 浏览 3 评论 0原文

我想做这样的事情:

case class D[X <: A](arg1 : X, arg2: Int) extends X {
}

D 是 arg1 的装饰器类,我想将其应用于作为 A 子类的几种不同类型的事物。

但是我收到此错误:

scala> case class D[X <: A](arg1 : X, arg2: Int) 扩展 X { override val name = "D"; } :6: 错误:需要类类型,但找到了 X

如果没有,是否有更 scalaish 的方法来做这种事情?

I'd like to do something like this:

case class D[X <: A](arg1 : X, arg2: Int) extends X {
}

D is kind of a decorator class for arg1, and I'd like to apply it to several different kinds of things that are subclasses of A.

However I get this error:

scala> case class D[X <: A](arg1 : X, arg2: Int) extends X { override val name = "D"; }
:6: error: class type required but X found

If not, is there a more scalaish way to do this kind of thing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

叫嚣ゝ 2024-11-04 00:11:26

您扩展的类必须在编译时已知,而类型参数通常不是。因此,不可能这样做。

但是,如果您尝试扩展 X 以从接口特征 A 中定义的方法的实现中受益,那么您可以混合使用 X 实例化类时。

new D with X

如果您想保留 D 的“case class”功能,则使用 D 作为代理,将调用转发到 A 中定义的方法> 到 X 类型的参数 arg1 是一种解决方案。

trait A {
  def foo
}
case class D[X <: A](arg1: X) extends A {
  def forw = arg1
  def foo = forw.foo
}

The class that you extend has to be known at compile time and a type parameter is generally not. Therefore, it's not possible to do this.

However, if you're trying to extend X to benefit from the implementations of methods defined in an interface trait A, then you can mix-in X when instantiating the class.

new D with X

If you'd like to preserve the 'case class' features of D, then using D as a proxy which forwards calls to methods defined in A to the parameter arg1 of type X is one solution.

trait A {
  def foo
}
case class D[X <: A](arg1: X) extends A {
  def forw = arg1
  def foo = forw.foo
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文