gpt4 book ai didi

java - 将 Scala 运算符添加到最终的 Java 类

转载 作者:搜寻专家 更新时间:2023-11-01 04:04:45 24 4
gpt4 key购买 nike

我在 Scala 中使用 jMonkeyEngine(Java 游戏引擎),到目前为止效果很好,但现在我问自己是否有一种优雅的方法来重载 Vector3f 的运算符(和类似的)类。我的第一个想法是继承 Vector3f 并重载运算符,但 Vector3f 是最终的,所以这不是一个选项。接下来我想也许我可以有一个单例/scala 对象,它带有在 Vector3f 上运行的静态方法,如下所示,但这也不起作用:

object VectorMath {
def *(factor: Float, vector: Vector3f) = vector.mult(factor)
}

//and then somewhere
import VectorMath._
var v = new Vector3f(1,2,3);
var u = 1.2f * v; //this does not work, because Float does not have * overloaded for Vector3f
var u = VectorMath.*(1.2f, v); //this does work, but defeats the purpose

所以我现在能想到的就是将 Vector3f 包装在一个新的 Scala 类中,并将运算符调用委托(delegate)给适当的 Java 方法。但是,这具有三个缺点:

  1. 我将不得不做很多来回转换(toVector3ffromVector3f 方法或类似的方法)。
  2. 当我有 Vector3f/ScalaVectors 数组时,这个问题会变得更糟。由于这些类不相关(组合除外),因此我每次在 jME 中调用方法时都必须手动转换数组的每个元素。
  3. 即便如此,我也不知道如何为我的新 ScalaVector 类重载运算符,以便我可以在前面加上因子,即 1.2f * v

我的问题:有人可以想办法让它更自然/优雅吗?你如何解决类似的问题?或者是否有我不知道的 Scala 语法来做这些事情?在 C++ 中,我会制作一个全局运算符,它将 float 和 Vector3f 作为参数并可能将其作为 friend 。 Scala 有什么方法可以做到这一点,或者根本不可能做到这一点?

最佳答案

Or is there maybe a Scala syntax that I don't know of to do these kinds of things?

是的,有隐式:

class VectorMath(f: Float) { def * (v: Vector3f) = v mult f }
implicit def VectorMath(f: Float) = new VectorMath(f)

val v = new Vector3f(1,2,3)
1.2F * v
// treated as: VectorMath(1.2F).*(v)

从 Scala 2.10 开始,隐式转换也可以写成:

implicit class VectorMath(f: Float) { def * (v: Vector3f) = v mult f }

从 2.10 开始,还有值类被编译器优化以获得更好的性能:

implicit class VectorMath(val f: Float) extends AnyVal { def * (v: Vector3f) = v mult f }

关于java - 将 Scala 运算符添加到最终的 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11004444/

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