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

在Scala中,我如何告诉抽象基类类型参数T是否支持从Int(或Float或

发布时间:2020-12-16 09:52:42 所属栏目:安全 来源:网络整理
导读:我很难从C / Templates的世界过渡到 scala.我习惯于能够在我想要的模板参数T上使用任何操作,只要我用来实例化T并支持那些操作(编译时鸭子打字,基本上).我在 Scala中找不到相应的成语,它允许我定义一个带有单个类型参数的抽象类,并且它需要类型T的某个接口.
我很难从C / Templates的世界过渡到 scala.我习惯于能够在我想要的模板参数T上使用任何操作,只要我用来实例化T并支持那些操作(编译时鸭子打字,基本上).我在 Scala中找不到相应的成语,它允许我定义一个带有单个类型参数的抽象类,并且它需要类型T的某个接口.

我几乎可以工作,但我无法弄清楚如何告诉抽象类(Texture [T<:Summable [T]])T支持从Int转换/构造.如何将隐式转换添加到特性Summable中,以便Texture知道T支持转换?

trait Summable[T] { 
   def += (v : T) : Unit
   def -= (v : T) : Unit   
}

object Int4 { implicit def int2Int4(i : Int) = new Int4(i,i,i) }

class Int4 (var x : Int,var y : Int,var z : Int,var w : Int) extends Summable[Int4] {
   def this (v : Int) = this(v,v,v)
   def += (v : Int4) : Unit = { x += v.x; y += v.y; z += v.z; w += v.w }
   def -= (v : Int4) : Unit = { x -= v.x; y -= v.y; z -= v.z; w -= v.w } 
}

abstract class Texture[Texel <: Summable[Texel]] {
   var counter : Texel
   def accumulate(v : Texel) : Unit = { counter += v }
   def decrement() : Unit = { counter -= 1 } //< COMPILE ERROR HERE,fails to find implicit
}

class Int4Target extends Texture[Int4] {
   var counter : Int4 = new Int4(0,1,2,3)
}

解决方法

您可以像这样定义隐式构造函数参数

abstract class Texture[Texel <: Summable[Texel]](implicit int2Texel: Int => Texel) {
//...

这基本上告诉编译器,为了构造Texture的实例,必须有一个从Int到Texel的隐式转换函数.假设你在范围内的某个地方定义了这样的函数(你可以这样做),你就不应该再遇到编译错误.

编辑2:好的,我最初误读了你的代码,你实际上只需要Int =>中的一个隐含参数.特克塞尔.您的代码通过上述修改为我编译.

编辑:您实际上需要2个转换函数,一个来自Texel => Int和> Int和另一个Texel为了正确地重新分配var

(编辑:李大同)

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

    推荐文章
      热点阅读