Scala:是否可以定义一个扩展其类参数的类?

标签 scala inheritance subclass

我想设计一个类作为任何其他类的包装器。我们将这个包装类称为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 类本身公开?

最佳答案

正如评论和 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
}

关于Scala:是否可以定义一个扩展其类参数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55600654/

相关文章:

api - 为什么 fold 在 Scala 中有以下类型?

scala - 在惰性求值中解释这种类型不匹配

Java- 继承问题。访问对象数组上的子类方法最初实例化了 super()

scala - 为什么 Scala 的 toSeq 将不可变的 Set 转换为可变的 ArrayBuffer?

scala - EC2 上的 Spark Streaming : Exception in thread "main" java. lang.ExceptionInInitializerError

c++ - 使用 SFINAE 检查模板参数继承

java - Java 中的继承——创建子类的对象也会调用父类(super class)的构造函数。为什么?

swift - 无法覆盖泛型类的子类中的初始化程序

python - 是否可以从作为参数给出的类继承?

c# - 如何重构这些锁?