我有一个这样的示例代码:
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
函数。我收到两个错误:
- 无法解析符号 MyTest
- 我不能写
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/