鑑於含有下列(冷凝)類的Java庫:Java方法錯誤地獲取自動重載科特林
public class Vector2f {
public float x;
public float y;
public Vector2f div(Vector2f other) {
x /= other.x;
y /= other.y;
return this;
}
public Vector2f div(Vector2f other, Vector2f dest) {
dest.x = x/other.x;
dest.y = y/other.y;
return dest;
}
/* ... */
}
由於自動地科特林合適方法名轉換成重載操作,我可以寫
val v0 = Vector2f(12f, 12f)
val v1 = Vector2f(2f, 2f)
val res = v0/v1
println(v0)
println(v1)
println(res)
res.x = 44f
println()
println(v0)
println(v1)
println(res)
...與完全出乎意料的結果是v0
得到由綴除法運算突變。並且此外,該參考存儲在res
指向相同的對象v0
輸出:
Vector2f(6.0, 6.0)
Vector2f(2.0, 2.0)
Vector2f(6.0, 6.0)
Vector2f(44.0, 6.0)
Vector2f(2.0, 2.0)
Vector2f(44.0, 6.0)
由於庫還提供了一種過載寫結果到另一個載體中,我想知道如果我不能告訴' kotlin不要使用提供的Vector2f.div(Vector2f)
方法。
我已經嘗試提供了一個擴展的方法來Vector2f
但得到的真正的成員陰影:
operator fun Vector2f.div(other: Vector2f): Vector2f = this.div(other, Vector2f())
^~~ extension is shadowed by a member: public open operator fun div(other: Vector2f!): Vector2f!
如果有興趣,請點擊這裏(https://github.com/elect86/glm)glm port – elect
@選擇使用你的端口是最好的解決方案,爲什麼你不作爲回答發佈? – voddan
害怕出現太多堅持/侵入性,但既然你建議,我會試試.. – elect