表达继承的不同符号

kir*_*uku 5 generics inheritance scala

为什么表达继承有不同的符号?在泛型中我必须使用<: - 运算符 - 在普通的类继承中我必须使用extends关键字.

例如,我必须写这个:

class X[A <: B] extends Y
Run Code Online (Sandbox Code Playgroud)

但为什么不写这样的东西:

class X[A <: B] <: Y
Run Code Online (Sandbox Code Playgroud)

要么

class X[A extends B] extends Y // like Java
Run Code Online (Sandbox Code Playgroud)

我对当前符号没有任何问题,但我想知道是否有理由以不同的方式标记泛型的类型层次结构.

Dan*_*ral 13

那么,有什么阻止这样做Scala的,但是,事实上,他们不表达同样的事情在所有.而且,事实上,你可以在Java中看到你可以写的地方X super Y,但你不能说class X super Y.

关键字extends表示之间的关系,继承之一.在另一方面,<:>:快递之间的关系类型,边界之一.当我说X <: Y的话,都有效X,并YString,例如,当String extends String将毫无意义.情况也是如此List[String] <: List[AnyRef],但是,这List[String] extends List[AnyRef]也是毫无意义的.并且,为了说明问题,这不是真的Set[String] <: Set[AnyRef].在所有这些例子中,我只是说我们正在讨论同一个,但不一定是同一.

当然,类型之间还存在其他关系,例如视图边界(<%)和上下文边界(:).

所以,仅仅因为extends暗示<:,它并不遵循这<:意味着extends,单独的,足以避免使用相同关键字的理由.再加上类型之间的其他关系,你几乎是一个封闭的交易.


Kev*_*ght 7

当你扩展(没有双关语)你的例子超出一个简单的情况时,它变得更加明显.

多重继承:

class C[A] extends X with Y with Z
Run Code Online (Sandbox Code Playgroud)

混入:

val x = new X with Y
Run Code Online (Sandbox Code Playgroud)

参数:

class X[A <: B] extends Y[A]
Run Code Online (Sandbox Code Playgroud)

多个(相关)类型参数:

class X[A >: B, B](x: A, xs: Seq[B])
Run Code Online (Sandbox Code Playgroud)

上下文边界:

class X[A : Manifest]
Run Code Online (Sandbox Code Playgroud)

查看范围:

class X[A <% Ordered[A]]
Run Code Online (Sandbox Code Playgroud)

通用方法:

class Foo[B] {
  def bar[A <: B](x: A) = ...
}
Run Code Online (Sandbox Code Playgroud)

如您所见,可以在类型参数中指定的关系比声明类时可用的简单线性层次结构更丰富,尤其是在允许边界时.

值得注意的是,通常会推断类或方法的泛型类型参数,允许您编写:

val myList = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

代替

val myList = List[Int](1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

因此,使用符号的方式是非常不同的.

更新

一个特定的例子只是浮现在脑海中,展示了同时使用这两种符号并展示它们如何保持不同:

def someMethod[T <: Foo with Bar](x: T) = ...
Run Code Online (Sandbox Code Playgroud)

这需要类型PARAM T是一个亚型的东西在这两个混合FooBar.

结构类型也是如此:

type Closable = { def close: Unit } //alias for a structural type
def someMethod[T <: Closable](x: T) = ...
Run Code Online (Sandbox Code Playgroud)