首页 文章

什么是[B>:A]“较低类型边界”在scala中的意思?为什么孩子班的obj也可以传入? [重复]

提问于
浏览
1

这个问题在这里已有答案:

:: method中有一个“Lower Type Bounds”:

def ::[B >: A] (x: B): List[B] =
new scala.collection.immutable.::(x, this)

[B>:A] mean B是A的Parent类,但为什么Child Class的对象可以在:: method中传递?

class GP
class P extends GP
class C extends P

val li : List[P] = List[P](new P)
(new GP)::li // ok
(new C)::li  // why here ok?

这个 (ndw C)::li // why here ok? ,(新C)是Child Class的obj而不是P的超级类,这是不是按照[B>:A])?

2 回答

  • 1

    如你所说, C 不是_或等于 P 的父级,因此 C 不能被选为 B 的值 . 但是,类型 C 的值可以传递给期望值为 P 的值的方法(因为 C 是子类),所以如果我们选择 B=P ,我们可以将 ::(x: P): List[P]new C 作为 x 的值传入 . 当你做 (new C) :: li 时会发生这种情况 .

    这就是为什么结果类型是 List[P] 而不是 List[C] (这将是错误的),而前一行的类型是 List[GP] ,因为在那一行 B=GP 必须选择类型来解决 .

  • 1

    这不是错误,因为 (new C)C 的实例,因此 P ;所以,在那个例子中, BA 类型变量都是 P .

    (你的下一个问题可能是 - 如果较低的类型绑定允许这个,那么它的用途是什么?答案是它允许这样:

    val liC : List[C] = List[C](new C)
    val liP : List[P] = (new P)::liC
    

    (实际上"promoting" a List[C]List[P] )不允许这样做:

    val liP : List[P] = List[P](new P)
    val liC : List[C] = (new C)::liP    // invalid! cannot downcast!
    

    . )

相关问题