我想知道Scala编译器(版本2.11.7)如何传递关于对象(也称为类型成员)中定义的类型的类型信息。
考虑这些课程:
trait Foo {
type Contents <: Any
val value: Contents
// Just a mock function call that uses a manifest.
def myCall(implicit mf: Manifest[Contents]): Contents = value
}
class Bar extends Foo {
type Contents = Int
val value = 20
}
class Baz extends Foo {
type Contents = String
val value = "it's baz"
}
现在,如果我有这样的电话:
(new Bar).myCall
它工作正常,我得到返回值20
。同样,做这样的调用也有效:
List(new Bar, new Bar).head.myCall
在这种情况下,我仍然会返回20
。但是,如果我从Foo
列表中拨打电话,请执行以下操作:
List(new Bar, new Baz).head.myCall
我收到编译错误,说没有可用于呼叫的清单。我的问题是,是否有可能在某处传递Manifest(或TypeTag~它并不重要),以某种方式允许上面的调用工作?如果是这样,怎么样?
答案 0 :(得分:1)
在您的第二种情况下,Foo
的基础类型为Bar
,因为它是Baz
和Foo
的最低常见类型。这意味着头部类型为val maybeBar = List(new Bar, new Baz).head
maybeBar match {
case b: Bar => println(b.myCall) // 20
case b: Baz => println(b.myCall) // it's baz
case _ => println("?")
}
。您可以模式匹配以找出确切的类型:
build.sbt