gpt4 book ai didi

scala - (在 Scala 中,)有什么可以用类的泛型类型参数来完成,但不能用抽象类型成员来完成的吗?

转载 作者:行者123 更新时间:2023-12-04 20:05:16 28 4
gpt4 key购买 nike

很明显,不能参数化具有抽象类型成员的方法。但是,除了类型和实例化可以写得更短的便利问题之外,是否有任何理由存在类的泛型类型参数,例如在以下抽象的 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)

这里是通过泛型类型参数实现的:
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)

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

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

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

最佳答案

Dean Wampler 和 Alex Payne 合着的《Programming Scala》一书给出了很好的 overview关于何时使用类型参数与抽象类型成员。

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

  • 抽象类型不能被方差注释 (见 p. 269)意思是没有等同于 trait List[+T]trait Function[-T,+R]与抽象类型成员。
  • 抽象类型可能会导致路径相关类型的不合理类型错误。在 p. 272 上有一个例子。 .
  • 关于scala - (在 Scala 中,)有什么可以用类的泛型类型参数来完成,但不能用抽象类型成员来完成的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26233434/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com