即使在了解了Scala中的静态超载后(What is Scala's static overloading rule?),我仍然无法将其用于<:<
类。
此类用来检查子类,并在Predef
定义:将scala静态超载规则应用到<:<
sealed abstract class <:<[-From, +To] extends (From => To) with Serializable
private[this] final val singleton_<:< = new <:<[Any,Any] { def apply(x: Any): Any = x }
然而,当我写A <:< B
我不知道如果我使用的<:<[A,A]
或<:<[B,B]
一个实例,因为下面的静态超载规则两者都不是那么具体。
我们先试试这只是为了确保它确实有效,我mycic
更换<:<
:
class superC
class subC extends superC
abstract class mycic[-From,+To] extends ((From) => To) with Serializable
object Main extends App {
implicit def FandT[A]: mycic[A,A] = new (mycic[A,A]) { def apply(x: A) ={x}}
val e = implicitly[subC mycic superC]
val a = new subC
e.apply(a)
}
这很好地运行。但是,当我们试图定义它使用哪一个:
class superC
class subC extends superC
abstract class mycic[-From,+To] extends ((From) => To) with Serializable
object Main extends App {
implicit val FF : mycic[subC,subC] = new(mycic[subC,subC]){def apply(x:subC) ={println("FF");x}}
implicit val TT : mycic[superC,superC] = new(mycic[superC,superC]){def apply(x:superC) ={println("TT");x}}
val e = implicitly[subC mycic superC]
val a = new subC
e.apply(a)
}
我们得到以下编译错误:它是在运行该代码使用
Main.scala:10: error: ambiguous implicit values:
both value TT in object Main of type => mycic[superC,superC]
and value FF in object Main of type => mycic[subC,subC]
match expected type mycic[subC,superC]
val e = implicitly[subC mycic superC]
^
哪mycic
隐含的实例?为什么它在第二个例子中表现不同?
对不起,但无法理解你的答案。通过类型为scala.Predef。$ conforms [Y],您是否回答了我的第一个问题,指出隐式发现是<:<[Y,Y],意思是子类?如果是的话,为什么这一个而不是另一个?我同意你可以在Y => X的地方使用Y => Y,但是你不能使用X => X吗?什么打破了对称? – user2759511
@ user2759511不知道为什么你仍然感到困惑,但这个类似的字眼答案可能会有所帮助。 HTTP://计算器。COM /问题/ 36035759 /如何 - 做最斯卡拉编译器,合成隐证据,与 –
我想你混淆类型推断(由推论提供什么类型的ARG)与重载(有一个与<不超载: <)。 –