4

可能重复:
Scala:抽象类型与泛型

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

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

4

1 回答 1

2

抽象类型和泛型之间有一个明显的区别,我们总是需要记住:

  • 如果一个类作为泛型类型,同一个类的多个实例可能有不同的泛型类型
  • 如果将具体类作为抽象类型,对于给定的 Scala 类,该(确切地说)类的所有实例都将具有相同的抽象类型。

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

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

如果你换个角度看,虽然将 GenericClass[T] 和 T 作为参数传递给方法是一个常见的特性,但设计一个接收 ClassWithAbstractTypeT 和 classWithAbstractType.T 的方法要难得多。实际上,除非路径相关的方法处于活动状态,否则禁止在 Scala 2.9 中编写类似的方法(如果我没记错的话,在 2.10 中默认情况下是活动的)

于 2012-08-04T16:19:28.633 回答