Étant donné une bibliothèque Java contenant la classe suivante (condensée):méthodes Java sont surchargés automatiquement à tort dans Kotlin
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;
}
/* ... */
}
Depuis Kotlin convertit automagiquement noms de méthode appropriés dans les opérateurs surchargées, je peux écrire
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)
... avec le résultat tout à fait inattendu que v0
obtient mutées par l'opération de division infix. Et, en outre, que la référence stockée dans res
points le même objet que v0
Sortie:
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)
Depuis la bibliothèque fournit également une surcharge pour écrire le résultat dans un autre vecteur, je me demandais si je ne peux dire ' kotlin de ne pas utiliser la méthode Vector2f.div(Vector2f)
fournie.
J'ai déjà essayé de fournir une méthode d'extension à Vector2f
mais qui obtient ombré par le vrai membre:
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!
Si vous êtes intéressé, [ici] (https://github.com/elect86/glm) un port glm – elect
@elect en utilisant votre port est la meilleure solution, pourquoi ne postez-vous pas comme une réponse? – voddan
Peur d'apparaître trop insistant/invasive, mais puisque vous l'avez suggéré, je vais essayer .. – elect