在这个Scala示例中,哪个是子类型函数?
我正在阅读Martin Odersky的Scala by example(2014)。 在第61页上,有一个从String类型到Int类型的函数被表示出来 作为trait函数1[String,Int]的实例。其中,函数1定义为:在这个Scala示例中,哪个是子类型函数?,scala,Scala,我正在阅读Martin Odersky的Scala by example(2014)。 在第61页上,有一个从String类型到Int类型的函数被表示出来 作为trait函数1[String,Int]的实例。其中,函数1定义为: trait Function1[-A,+B]{def apply(x:A):B} 再往下也有人说 S=>T是S'=>T'的子类型,前提是S'是S的子类型,T是T'的子类型 他使用以下代码示例: val f:(AnyRef=>Int)=x=>x.hashCode() v
trait Function1[-A,+B]{def apply(x:A):B}
再往下也有人说
S=>T是S'=>T'的子类型,前提是S'是S的子类型,T是T'的子类型
他使用以下代码示例:
val f:(AnyRef=>Int)=x=>x.hashCode()
val g:(字符串=>Int)=f
g(“abc”)
这是我的问题。
因为String是AnyRef的子类型,所以我假设在这个例子中f代表g的子类型。对吗?
如果是,请解释该确定中的逻辑。f和g函数,函数具有类型差异,允许类型参数的子类型和超类型: 在scala终端中运行以下代码将得到与运行示例相同的结果 g被声明为类型(AnyRef=>Int)的函数,该函数将实现如下函数:
val f = new Function[AnyRef /*or any supertype*/,Int /*or any subType type*/] {
def apply(x: AnyRef): Int = x.hashCode()
}
它被定义为一个函数,它接受类型为AnyRef
的参数,返回Int
然后将g定义为一个函数,该函数接受字符串
,并返回Int
。它被设置为等于f,因此它变成:
val g = new Function[String /*Supertype of AnyRef*/, Int] {
def apply(x: String): Int = x.hashCode()
}
虽然在这种情况下,g不是一个新函数。g只是f的另一个参考。从本质上讲,g是f类型转换为函数[String,Int]
编辑:由于AnyVal是Int的子类型,因此也可以执行以下操作:
val gg: (String => AnyVal) = f
f和g函数,函数具有类型差异,允许类型参数的子类型和超类型: 在scala终端中运行以下代码将得到与运行示例相同的结果 g被声明为类型(AnyRef=>Int)的函数,该函数将实现如下函数:
val f = new Function[AnyRef /*or any supertype*/,Int /*or any subType type*/] {
def apply(x: AnyRef): Int = x.hashCode()
}
它被定义为一个函数,它接受类型为AnyRef
的参数,返回Int
然后将g定义为一个函数,该函数接受字符串
,并返回Int
。它被设置为等于f,因此它变成:
val g = new Function[String /*Supertype of AnyRef*/, Int] {
def apply(x: String): Int = x.hashCode()
}
虽然在这种情况下,g不是一个新函数。g只是f的另一个参考。从本质上讲,g是f类型转换为函数[String,Int]
编辑:由于AnyVal是Int的子类型,因此也可以执行以下操作:
val gg: (String => AnyVal) = f
如果
V
是U
的一个子类型,则V
可以位于U
可以位于的任何位置
如果你有一个AnyRef=>Int
,你能在任何时候使用String=>Int
吗?对String
是一个AnyRef
,因此您可以将其传入
因此,AnyRef=>Int
是String=>Int
的一个子类型。这种关系(有点“倒退”)是通过函数在其参数中是逆变的来描述的
也就是说,实例
f
和g
不一定有任何关系。但是它们的类型确实如此。如果V
是U
的一个子类型,那么V
可以站在U
可以站的任何地方
如果你有一个AnyRef=>Int
,你能在任何时候使用String=>Int
吗?对String
是一个AnyRef
,因此您可以将其传入
因此,AnyRef=>Int
是String=>Int
的一个子类型。这种关系(有点“倒退”)是通过函数在其参数中是逆变的来描述的
也就是说,实例f
和g
不一定有任何关系。但他们的类型确实如此