gpt4 book ai didi

scala - 在 Scala 中,我如何告诉抽象基类类型参数 T 支持从 Int(或 Float,或...)进行隐式转换?

转载 作者:行者123 更新时间:2023-12-04 23:07:12 24 4
gpt4 key购买 nike

我很难从 C++/模板世界过渡到 scala。我习惯于对我想要的模板参数 T 使用任何操作,只要我用来实例化 T 的任何东西都支持这些操作(基本上是编译时 Duck 类型)。我在 Scala 中找不到相应的习惯用法,它允许我定义一个具有单个类型参数的抽象类,并且它需要类型 T 的某个接口(interface)。

我几乎可以工作,但我不知道如何告诉抽象类(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, 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, 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 的实例。 ,必须有一个隐式转换函数可从 IntTexel .假设您在范围内的某处定义了这样的函数(您这样做了),您应该不再收到编译错误。

Edit2:好的,我最初误读了您的代码,实际上您只需要 Int => Texel 中的一个隐式参数.您的代码通过上述修改为我编译。

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

关于scala - 在 Scala 中,我如何告诉抽象基类类型参数 T 支持从 Int(或 Float,或...)进行隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245717/

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