【发布时间】:2015-02-27 10:23:33
【问题描述】:
object ExistentialTypesAsFunctionParameters extends App{
def m(p: T forSome {type T})=p.toString
def m1(p:Any)=p.toString
println(m("Hello"))
println(m1("Hello"))
}
此程序运行并打印Hello 两次。
m 和m1 有什么区别,有什么区别吗?
与Any 相比,存在类型T forSome {type T} 允许的值是多少?
最重要的是:
如何根据 Scala 语言规范回答这些问题?
换句话说,需要根据 Scala 语言规范进行解释。
编辑:
跟进问题:
class Top
class Middle extends Top {override def toString()="Middle"}
class Bottom extends Middle
object ExistentialTypesAsFunctionParameters extends App{
def m3(p: T forSome {type T >: Middle })=p.toString
println(m3(new Middle))
println(m3(new Bottom))
println(m3(new Top))
}
此代码编译并运行。
但我希望println(m3(new Bottom)) 不会编译,因为T forSome {type T >: Middle } 的限制应该意味着任何类型可以是Middle 子类型的值v 不应该具有T forSome {type T >: Middle } 类型。
那么为什么这段代码还能编译呢?
【问题讨论】:
标签: scala types existential-type