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