这个问题在这里已经有了答案:
8年前关闭。
按照我的理解,下面两个类的定义是一样的。那么除了语法之外,还有什么区别呢?
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
最佳答案
我们总是需要记住抽象类型和泛型之间的明显区别:
现在您应该清楚这两者可以以不同的方式使用:
如果从另一个角度来看,虽然将 GenericClass[T] 和 T 作为参数传递给方法是一个常见的特征,但设计一个接收 ClassWithAbstractTypeT 和 classWithAbstractType.T 的方法则更为罕见。事实上,除非路径相关的方法处于事件状态,否则在 Scala 2.9 中编码这样的方法是被禁止的(如果我没记错,默认情况下在 2.10 中是事件的)
关于T 型和 [T] 型之间的标度差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11808966/