类型T和[T]之间的scala差异

时间:2012-08-04 13:15:06

标签: scala generics

  

可能重复:
  Scala: Abstract Types vs Generics

我理解它的方式,以下两个类定义是相同的。除了语法之外,还有什么区别?

abstract class Container[T] {}
class IntContainer extends Container[Int] {}

abstract class Container2 { type T }
class IntContainer2 extends Container2 { type T = Int }

当我查看反编译的字节代码时,我注意到第一个集合仍然具有泛型(尽管IntContainer被定义为具有类型Object:public class IntContainer extends Container<Object>)。第二组没有这样的信息。我认为所有通用类型都被删除了......

PS使用Scala 2.10-M5

1 个答案:

答案 0 :(得分:1)

抽象类型和泛型之间存在明显的差异,我们总是需要记住:

  • 如果一个类作为泛型类型,则同一个类的多个实例可以具有不同的泛型类型
  • 如果具体类作为抽象类型,对于给定的Scala类,该(完全相同)类的所有实例将具有相同的抽象类型。

现在应该清楚,两者可以以不同的方式使用:

  • 泛型主要是为必须充当容器的类而设计的,或者是应该对给定目标执行某些操作的业务类。从这个意义上讲,泛型参数允许您在编译时检查类型安全性
  • 抽象类型主要用于定义更高级别的行为或属性,并在子类化时对其进行细化。泛型与继承关系不大

如果你从另一个角度来看,虽然将GenericClass [T]和T作为参数传递给方法是一个常见的特性,但设计一个接收ClassWithAbstractTypeT和classWithAbstractType的方法却更为罕见。 T.实际上,除非路径依赖的方法处于活动状态,否则禁止对Scala 2.9中的方法进行编码(如果我没有错,则默认情况下在2.10中处于活动状态)