[英]Scala: explicitly specifying context bound in a second constructor
为什么允许这样做:
class Foo[O: Option](s: String)
new Foo[Any]("foo")(None)
虽然不是:
class Foo[O: Option](s: String) {
def this() = this("foo")(None)
}
编译器消息:
Foo [O]不接受参数
有没有办法在构造函数中提供明确绑定的上下文?
《好书》说上下文的界限等同于隐含的证据。
正如@ gabriele-petronella指出的那样:
class Foo[O](s: String)(implicit o: Option[O]) {
def this() = this("foo")(None)
}
但是在存在上下文绑定的情况下,解析器会自动附加证据参数:
class Foo[O] extends scala.AnyRef {
<paramaccessor> private[this] val s: String = _;
implicit <synthetic> <paramaccessor> private[this] val evidence$1: Option[O] = _;
def <init>(s: String)(implicit evidence$1: Option[O]) = {
super.<init>();
()
};
def <init>()(implicit evidence$2: Option[O]) = {
<init>("foo")(None)(evidence$2);
()
}
}
因此,错误是由于附加的arg引起的。
的确,您不能在辅助构造函数中执行任何操作来强制类型参数,即,将其实例化为特定的类型arg。 ( 请参阅此处 。)
解决方法起作用的原因是任何类型参数的None <:< Option[Nothing] <:< Option[O]
。
正如@ gabriele-petronella所指出的,在同伴中,您可以执行任何操作:
object Foo { def apply() = new Foo[Int]("five")(Some(5)) }
可以说,编译器可以等待决定要调用的构造函数,然后确定是否需要隐式,然后在这种情况下忽略辅助ctor的隐式。 但是在Scala中,构造函数故意简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.