加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:39:03 所属栏目:安全 来源:网络整理
导读:很明显,不能用抽象类型成员参数化方法.但是,是否有任何理由存在类的泛型类型参数,除了类型和实例化可以写得更短的便利问题,例如,在以下抽象的List-ArrayList场景中: 这里,参数化由抽象类型成员实现: trait base1 { type X def id(x: X): X}class extension
很明显,不能用抽象类型成员参数化方法.但是,是否有任何理由存在类的泛型类型参数,除了类型和实例化可以写得更短的便利问题,例如,在以下抽象的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编写的Scala编程和Alex Payne给出了一个关于何时使用类型参数与抽象类型成员的 overview.

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

>抽象类型不能进行方差注释(见p. 269)含义与具有抽象类型成员的特征List [T]或特征函数[-T,R]无等价.
>抽象类型可能导致具有路径依赖类型的不合理类型错误.在p. 272有一个例子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读