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





Как было предложено в комментариях и в ответ Кевина, попробуйте использовать неявное преобразование следующим образом.
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
}
Я не думаю, что вы можете
Virtual[T]автоматически реализовывать методыT, но если вам нужно что-то, что дает вам все, что естьT, но позволяет добавить еще несколько методов, вы можете использовать для этого неявные классы Scala. Тогда уxбудут фактически все методыString, а также все, что вам может понадобиться. См., например, Обернутая строка (данный эффект с неявными методами преобразования вPredef.scala, а не с помощью неявного класса, но это та же идея)