(在Scala中)可以使用类的泛型类型参数来完成,而不能使用抽象类型成员来完成吗?

马雅可夫斯基

显然,不能使用抽象类型成员对方法进行参数化。然而,没有任何理由的泛型类型参数存在的类除了方便的问题是类型和实例可以在下面的列表抽象,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)

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

这个采访马丁·奥德斯基是一个伟大的介绍,但它似乎并没有回答这个问题。

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

马丁环

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

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

  1. 不能对抽象类型进行方差注释(请参见第269页),这意味着没有等同于抽象类型成员trait List[+T]trait Function[-T,+R]与抽象类型成员相同的成员。

  2. 抽象类型可能导致依赖于路径的类型导致不合理的类型错误。p上有一个示例272

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

不能使用R作为化类型参数使用抽象类Kotlin中的类代替

泛型类型可以实现多个抽象类吗?

您可以使用特定的类型化类来继承泛型类吗?

Kotlin抽象类,具有泛型参数和使用类型参数的方法

Java 中的泛型 - 使用抽象类进行类型擦除

Scala类型类可以具有抽象类型成员吗?

Scala:抽象类型与泛型

为什么不能使用抽象类型的具体实现来推断ClassTag?

选择类型的输入可以使用不扫描列表的选项来完成吗?

Scala:使用类型参数或抽象类型作为类型界限

使用类型参数与抽象类型实现类型类

可以使用泛型类型实现Flink的AggregateFunction吗?

使用类型泛型时如何正确地将类转换为抽象类?

Scala抽象类型可以容纳type参数吗?

我可以使用invoke来抽象类方法吗

我可以使Swift枚举泛型,所以我可以使用它的情况来为泛型类推断类型吗?

我可以使用 Typescript 泛型根据类型从对象中过滤键吗?

使用泛型在抽象类中调用构造函数

Scala抽象类型成员

为什么python中的列表可以从np.float64类型中减去而不能使用int类型?

Dotty无法使用抽象类型来推断带有类型参数特征的通用Scala函数的结果类型

Kotlin 泛型不能使用 T 作为具体化的类型参数

F#抽象类类型成员表达式可以被“抽象覆盖”吗?

如何使用泛型类型数组和泛型类型类作为构造函数中的参数?

在无形状的Scala中,可以将文字类型用作泛型类型参数吗?

了解Scala对抽象类型和类的使用

解决Java的泛型类型的错误与抽象类方法

用泛型类型实例化抽象类的对象

继承需要构造函数的泛型类型的抽象类