区别在于类型系统何时决定 T 是什么。
也许最好的答案是,尝试在一些代码中使用这两种类型,看看会发生什么,并尝试找出原因。但我会先尝试解释一些类型理论。在这种情况下:
Array[T forSome { type T; }]
forSome 在[] 括号内,每个元素本身必须以某种方式解释为T forSome { type T; }。好的,所以Int 对于某些类型的T 是T,所以你可以在数组中放置Int。 String 对于某些类型 T 也是 T,因为选择 forSome 一次仅适用于一个元素,所以您可以说 T 这次是 String 而不是 @987654335 @,因此您可以将 String 放入数组中,即使它已经包含 Int。
另一方面,虽然我们可以为数组的任何元素独立选择T,但数组本身的类型已经被选择:它是可以容纳任何东西的数组类型。不能是Array[Int] 或Array[String]。
但在这种情况下:
Array[T] forSome { type T; }
类型T 只在数组外决定一次。该数组实际上可以是Array[Int]、Array[String] 或Array[Any]。但是一旦选择了 T 类型,数组的所有元素都必须与该类型保持一致。
好的,现在让我们尝试一些代码。这是一个例子:
scala> var a = Array(1,2);
a: Array[Int] = Array(1, 2)
scala> def first(z : Array[T] forSome { type T }) = z(0);
first: (z: Array[_])Any
scala> def firstany(z : Array[T forSome { type T }]) = z(0);
firstany: (z: Array[T forSome { type T }])Any
scala> first(a);
res0: Any = 1
scala> firstany(a);
error: type mismatch;
found : Array[Int]
required: Array[T forSome { type T }]
firstany(a);
^
为什么会出错?因为数组a 的类型为Array[Int],它只能包含Int 类型的东西。那肯定是Array[T] forSome {type T},因为类型系统需要做的就是选择Int 作为类型T。因此first(a) 是可以的。但是如上所述,Array[T forSome { type T }] 不能是Array[Int],所以firstany(a) 是一个错误。
但以下是可以的,因为Array[Any] 是Array[T forSome { type T }]:
scala> var b = Array(1, "x");
b: Array[Any] = Array(1, x)
scala> firstany(b);
res1: Any = 1