Я пишу класс 2D Vector, объявление которого выглядит следующим образом:
case class Vec2(x:Float, y:Float) extends (Float, Float)(x, y) {
def +(v:Vec2) = Vec2(v.x+x, v.y+y)
//Subtract, dot product, projection, etc.
...
...
}
Я бы хотел написать что-то вроде Vec2(3, 7) + (2, 9)
, поэтому я пишу
scala> implicit def ii2v2(i:(Int, Int)) = Vec2(i._1, i._2)
ii2v2: (i: (Int, Int))org.zhang.lib.misc.Vec2
scala> Vec2(2, 6) + (3, 1)
res25: org.zhang.lib.misc.Vec2 = (5.0,7.0)
Отлично. Но неявное не будет работать, если я попытаюсь Vec2(3, 7) + (2.6f, 9.3f)
, так как (Float, Float)
не соответствует (Int, Int)
. Единственное решение, которое я нашел, это написать ЧЕТЫРЕ следствия для (Int,Int), (Int, Float), (Float, Int), and (Float, Float)
.
Проблема становится нелепой, когда вы пытаетесь учесть двойные числа, или когда вы пишете класс Vec3. Это можно обойти? Я мог бы просто Vec2-если все, но часть меня просто хочет добавить (Int, Int) к Vec2:)