(在Scala中)是否可以使用类的泛型类型参数而不是抽象类型成员来完成任何操作?

Maj*_*kij 5 generics parameters types scala abstract

很明显,不能用抽象类型成员参数化方法.但是,是否有任何理由存在类的泛型类型参数,除了类型和实例化可以写得更短的便利问题,例如在以下抽象的List-ArrayList场景中:

这里,参数化由抽象类型成员实现:

trait base1 {
    type X
    def id(x: X): X
}
class extension1 extends base1 {
    override def id(x: X): X = x
}
val ext1: base1 { type X = Int } = new extension1 { type X = Int }
val y1 = ext1.id(0)
Run Code Online (Sandbox Code Playgroud)

这里通过泛型类型参数实现:

trait base2[X] {
    def id(x: X): X
}
class extension2[X] extends base2[X] {
    override def id(x: X): X = x
}
val ext2: base2[Int] = new extension2[Int]
val y2 = ext2.id(0)
Run Code Online (Sandbox Code Playgroud)

后一种解决方案更方便,更易读.这本身很重要,但我对更一般的,即语义的观点感兴趣.

这次对Martin Odersky的采访是一个很好的介绍,但它似乎没有回答这个问题.

非常感谢您的任何提示或解释!

Mar*_*ing 5

Dean Wampler 和 Alex Payne 合着的Programming Scala一书很好地概述了何时使用类型参数与抽象类型成员。

除了不能参数化方法(这可能是一个很大的限制)之外,抽象类型成员还有两个限制:

  1. 抽象类型不能被变异注释(参见第 269 页) 意思是没有与抽象类型成员等效trait List[+T]trait Function[-T,+R]与之相同的成员。

  2. 抽象类型可能会导致路径相关类型的不合理类型错误。在p上有一个例子272 .