Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 表示继承的不同符号_Generics_Inheritance_Scala - Fatal编程技术网

Generics 表示继承的不同符号

Generics 表示继承的不同符号,generics,inheritance,scala,Generics,Inheritance,Scala,为什么有不同的符号来表示继承?在泛型中,我必须使用当你把你的例子扩展到一个简单的例子之外(没有双关语)时,它会变得更加明显 多重继承: class C[A] extends X with Y with Z 混合: val x = new X with Y 参数化: class X[A <: B] extends Y[A] 上下文边界: class X[A : Manifest] 视图边界: class X[A <% Ordered[A]] 而不是 val myList =

为什么有不同的符号来表示继承?在泛型中,我必须使用当你把你的例子扩展到一个简单的例子之外(没有双关语)时,它会变得更加明显

多重继承:

class C[A] extends X with Y with Z
混合:

val x = new X with Y
参数化:

class X[A <: B] extends Y[A]
上下文边界:

class X[A : Manifest]
视图边界:

class X[A <% Ordered[A]]
而不是

val myList = List[Int](1, 2, 3)
因此,符号的使用方式是非常不同的

更新

一个特别的例子刚刚浮现在脑海中,演示了同时使用两种符号,并说明了它们需要如何保持不同:

def someMethod[T <: Foo with Bar](x: T) = ...
没有什么能阻止Scala这么做,但是,事实上,它们根本不表达相同的东西。事实上,您可以在Java中看到,您可以编写
xsupery
,但不能说
classxsupery


关键字
扩展
表示类之间的关系,这是继承关系之一。另一方面,
表示类型之间的关系,边界之一。当我说
X++1谈论类和类型之间的区别时,将类和类型视为不同的东西,使用不同的符号是有意义的。谢谢你的解释。
class X[A : Manifest]
class X[A <% Ordered[A]]
class Foo[B] {
  def bar[A <: B](x: A) = ...
}
val myList = List(1, 2, 3)
val myList = List[Int](1, 2, 3)
def someMethod[T <: Foo with Bar](x: T) = ...
type Closable = { def close: Unit } //alias for a structural type
def someMethod[T <: Closable](x: T) = ...