繁体   English   中英

Scala:在第二个构造函数中显式指定上下文绑定

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM