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

T型和[T]型之间的scala差异,scala,generics,Scala,Generics,可能重复: 按照我的理解,以下两个类定义是相同的。那么除了语法之外,还有什么区别呢 abstract class Container[T] {} class IntContainer extends Container[Int] {} abstract class Container2 { type T } class IntContainer2 extends Container2 { type T = Int } 当我查看反编译的字节码时,我注意到第一个集合仍然具有泛型(尽管IntCo

可能重复:

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

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

abstract class Container2 { type T }
class IntContainer2 extends Container2 { type T = Int }
当我查看反编译的字节码时,我注意到第一个集合仍然具有泛型(尽管IntContainer被定义为具有type Object:
公共类IntContainer extensed Container
)。第二组没有这样的信息。我以为所有的泛型类型都被删除了


PS使用Scala 2.10-M5

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

  • 如果将一个类作为泛型类型,则同一类的多个实例可能具有不同的泛型类型
  • 如果将一个具体类作为抽象类型,对于给定的Scala类,该类的所有实例都将具有相同的抽象类型
现在您应该清楚,这两种方法可以以不同的方式使用:

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

如果从另一个角度来看,虽然将GenericClass[T]和T作为参数传递给方法是一个常见的特性,但设计一个接收带有AbstractTypeT的类和带有AbstractType.T的类的方法要难得多。事实上,除非路径相关方法处于活动状态(如果我没有记错的话,在2.10中默认处于活动状态),否则禁止对Scala 2.9中的方法进行编码。

这是您尝试过的,还是您尝试过实际使用这些
IntContainer
对象?我在每个超类中添加了一个ArrayBuffer字段,并添加了一个“add”方法,它将委托给缓冲区,并且在这两种情况下它都按预期工作。尝试添加字符串在这两种情况下都会失败,出现“类型不匹配;找到:String(“asdf”)required:asdf.ic2.T(扩展为)Int”。你的观点是什么@Gabe,因为我想我错过了它?参见例如或。@TravisBrown第一、第四和第五个链接是最好的,突出了每个链接的优点/缺点。谢谢有趣的是,Martin Odersky声称abtract类型可以做泛型所能做的一切,甚至建议从语言的更高版本(可能在4.0时间框架内)中删除泛型。完全删除泛型?你能提供更多的细节吗?Martin Odersky在这里建议,尽管没有提到版本4.x: