保留嵌套类型的类型信息

时间:2016-03-23 16:23:54

标签: scala types

我想知道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~它并不重要),以某种方式允许上面的调用工作?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

在您的第二种情况下,Foo的基础类型为Bar,因为它是BazFoo的最低常见类型。这意味着头部类型为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