簡體   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