Scala: можно ли определить класс, который расширяет его параметр класса? - PullRequest
2 голосов
/ 09 апреля 2019

Я хочу создать класс, который будет служить оберткой для любого другого класса. Давайте назовем этот класс-оболочку 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?

1 Ответ

2 голосов
/ 10 апреля 2019

Как предлагается в комментариях и в ответе Кевина , попробуйте использовать неявное преобразование, например, так:

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
}

...