【问题标题】:Scala: Is it possible to define a class that extends its class parameter?Scala:是否可以定义一个扩展其类参数的类?
【发布时间】:2019-08-31 05:02:23
【问题描述】:

我想设计一个类来包装任何其他类。我们称这个包装类为Virtual,它的用法如下:

val x: String = "foo"
val y: Virtual[String] = new Virtual(x)
// any method that can be called on x can also be called on y,
// i.e., Virtual[String] <: String

// example:
y.toUpperCase // will change the wrapped string to an upper case

这是我目前所拥有的:

class Virtual[T](obj: T) extends T {
  // any Virtual specific methods here
}

扩展类型参数似乎并不能解决问题...

换句话说: 如何保证被Virtual封装的类暴露的方法也被Virtual类本身暴露?

【问题讨论】:

  • 我不认为你可以让Virtual[T] 自动实现T 的方法,但是如果你所追求的是能够为你提供T 的所有东西但让你添加一些更多方法,您可以使用 Scala 的隐式类。然后x 将有效地拥有String 的所有方法,以及您可能想要的任何其他方法。参见例如WrappedString(使用Predef.scala 中的隐式转换方法而不是隐式类,但这是相同的想法)

标签: scala inheritance subclass


【解决方案1】:

按照 cmets 和 Kevin's answer 中的建议,尝试像这样使用隐式转换

object Hello extends App {
  class Virtual[T](val delegate: T) {
    def bar(i: Int): Int = i + 1
  }
  implicit def VirtualToDelegate[T](virtual: Virtual[T]): T = virtual.delegate
  val str = "foo"
  val virtual = new Virtual[String](str)
  println(virtual.toUpperCase) // FOO
  println(virtual.bar(7))      // 8
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2010-12-05
    • 2015-01-18
    • 2021-12-24
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多