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

模板 – 为什么Scala辅助构造函数中不允许使用类型参数?

发布时间:2020-12-16 09:01:45 所属栏目:安全 来源:网络整理
导读:说我在 Scala中定义一个简单的2D点类,我想要能够用各种类型构造它: class Point(x:Float,y:Float) { this(x:Double,y:Double) = this(x.toFloat,y.toFloat) this(x:Int,y:Int) = this(x.toFloat,y.toFloat) // etc...} 我想使用一个模板来打开它,比如: cla
说我在 Scala中定义一个简单的2D点类,我想要能够用各种类型构造它:

class Point(x:Float,y:Float) {
    this(x:Double,y:Double) = this(x.toFloat,y.toFloat)
    this(x:Int,y:Int) = this(x.toFloat,y.toFloat)
    // etc...
}

我想使用一个模板来打开它,比如:

class Point(x:Float,y:Float) {
    this[T](x:T,y:T) = this(x.toFloat,y.toFloat)
}

我知道这将无法正常工作,因为T可能是一个没有定义toFloat的类型,但我得到的编译器错误是:

no type parameters allowed here

这是否在Scala中不受支持?如果是这样,为什么,有没有简单的方法来解决这个问题?

解决方法

Scala的类构造函数(不像Java的)不能使用类型参数,只有类本身可以.至于为什么Scala做出这样的设计选择,我认为主要原因是简单.

如果您想要一个通用的辅助“构建器”方法,那么自然要做的就是在伴随对象上定义它.例如,

object Point {
  def build[T : Numeric](x: T,y: T) = {
    val n = implicitly[Numeric[T]]
    new Point(n.toFloat(x),n.toFloat(y))
  }
}

class Point(val x:Float,val y:Float)

val p = Point.build(1,2) // Companion object's builder
p.x + p.y

这里我使用数字类型类来获取一个通用的toFloat方法.

(编辑:李大同)

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

    推荐文章
      热点阅读