我即将使用LibGDX写一个2D游戏,它有很好的类,如 Vector2
.
由于我是以功能性方式(复制,模式匹配等)编写的,我希望它是一个案例类 .
因为它不是一个,所以我决定尝试扩展它而没有成功:
import com.badlogic.gdx
class Vector2(x: Float, y: Float) extends gdx.math.Vector2(x, y) {
def copy(x: Float = this.x, y: Float = this.y): Vector2 = {
new Vector2(x, y)
}
}
object Vector2 {
def apply(x: Float = 0, y: Float = 0): Vector2 = {
new Vector2(x, y)
}
}
问题是以下引发 println(Vector2(1, 2).x)
因为没有 x
字段 .
如果我像 class Vector2(override val x: Float, override val y: Float)
那样写它会抛出:
在Float类型的Vector2类中重写变量x;值x具有不兼容的类型类Vector2(覆盖val x:Float,override val y:Float)extends gdx.math.Vector2(x,y){
我无法让这个工作 . 我也尝试了 var
而没有成功 java.lang.Float
.
编辑:似乎这是不可能的,因为Scala生成一个函数,并且Java代码中没有等效函数 .
2 回答
你正在影响你想要的
x
.人们常常因为需要重命名类参数以避免创建字段而烦恼 .
见this symptom和the shadowing issue .
在这种情况下,它会导致互操作问题 .
脚注:
之前,
因为
this.x
在子类中创建了一个私有字段 .错误的表达不应该试图访问该字段;在没有访问者
x
的情况下,它应该你不能用
super.x
绕过阴影,因为它不是def
.我尝试了很多东西,看起来你在编辑中得出的结论是正确的 .
然而,有一种更迂回的方式来完成这项工作:
// println(s“v2 = $ v2a; sum = $ sumA; hasOppositeDirection = $ ”)}}
运行此产生:
不幸的是,正如评论所指出的那样,对于Vector2继承的方法,这似乎失败了 . 实际上,我不确定为什么会这样 . 然而,这种方法还有一个优点 . 例如,您可以在
V2
上定义+
,-
等,以增强底层gdx.math.Vector2
的可用性 .