Scala:如何使用类型参数化在类内部打印

标签 scala types

我有一个这样的示例代码:

trait X{
  val a=1;
  val b=2;
}

case class Y(override val a:Int, override val b:Int) extends X{
  def sum(c:Int)=a+b+c
}

case class Z(override val a:Int, override val b:Int) extends X{
  def sum(c:Int)=a+b+c+10
}



object Test{
  def main(args: Array[String]) {
    val z = Z(1, 2)
    val y = Y(3, 4)
    println (y.sum(5))
    MyTest[Z].myprint(z) //error here
  }
}

class MyTest[A] {
  def myPrint(z: A): Unit =
    if (z.isInstanceOf[A]) {
      val c = z.asInstanceOf[A]
      println(c.sum(4)) //error here
    }
}

我想做的是创建一个参数化类 MyTest,其函数将打印作为参数传递的类的 sum 函数。我收到两个错误:

  1. 无法解析符号 MyTest
  2. 我不能写c.sum(),因为显然编译器没有关于A中可以传递什么样的类的信息。

请注意,如果我将方法 myPrint 放在 Test 中(无论如何这是一个更好的设计),我仍然遇到第二个问题。

有什么办法可以解决这个问题吗?

最佳答案

你不能这样做

MyTest[Z].myprint(z)

因为它是一个类,所以你必须先实例化它

val test = new MyTest[Z]
test.myprint(z)

顺便请注意,您声明了 myPrint 并且使用了不同的标识符 myprint...

或者您可以使用通用方法创建一个对象

object MyTest {
  def myPrint[A](z: A): Unit = ???
}

关于另一个问题,如果您想调用 sum 告诉编译器 myPrint 采用具有此方法的类型的参数。例如,您可以将其放入您的特质中

trait X {
  val a = 1
  val b = 2

  def sum(c: Int): Int
}

并在子类中实现它

然后你可以将其声明为

def myPrint(x: X): Unit =
  println(x.sum(4))
}

我把4作为参数,因为我不知道你真正想要完成什么,因为你的代码没有将任何参数传递给你声明接受一个Int的函数>

声明类型的另一种方法(不是将 sum 添加到 X 特征中,而是创建另一个特征

trait Summable {
  def sum(c: Int): Int
}

并让你的类实现它

case class Y(override val a:Int, override val b:Int) extends X with Summable

然后 myPrint 需要接受 Summable 而不是 X

最后您可以使用结构类型并声明 myPrint 如下

def myPrint(x: { def sum(a: Int): Int }): Unit =
  println(x.sum(4))
}

关于Scala:如何使用类型参数化在类内部打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34070664/

相关文章:

Pandas 计算 astype 错误的数量

Java 与 Scala 功能接口(interface)用法

scala - Play Framework - 手动升级到 Web 套接字

scala - 如何使用 Play 2.5 在分块响应中将 Anorm 大型查询结果流式传输到客户端

scala - 如何在 scala 中查找流中的第一个重复项

c++ - 类类型作为参数和作为属性

c++ - 为什么相同类型的数据单元有不同的名称?

json - Play Framework : How to convert strings to numbers while validating JSON

c - 使用为其他类型声明的内存

c++ - ptr_map 插入