我正在尝试创建一个对所有数字类型通用的Vector类.我最初的尝试是为所有类型编写一个类,如下所示:
class Vector3f(val x:Float, val y:Float, val z:Float)
Run Code Online (Sandbox Code Playgroud)
因为scala支持专门的注释,所以我可以使用它来为所有数字类型生成这些类
class Vector3[A <: What?](val x:A,val y:A, val z:A)
Run Code Online (Sandbox Code Playgroud)
但我发现作为数字的超级类型的所有东西都是AnyVal,但AnyVal不支持+ - */.那么正确的方法是什么,但不牺牲未装箱数字类型的性能?
注意:我正在提出这个问题来自己回答,但欢迎其他答案.
请考虑以下简单方法:
def add[T](x: T, y: T)(implicit num: Numeric[T]) = num.plus(x,y)
Run Code Online (Sandbox Code Playgroud)
我可以使用如下的上下文绑定重写它
def add[T: Numeric](x: T, y: T) = ??.plus(x,y)
Run Code Online (Sandbox Code Playgroud)
但是如何获取该Numeric[T]类型的实例以便我可以调用该plus方法?
我在Scala中遇到了一个小问题.在Haskell中,我可以这样做:
add :: (Num a) => (a,a) -> (a,a) -> (a,a)
Run Code Online (Sandbox Code Playgroud)
这样,我可以投入add任何类型的数字和支持+等.我希望Scala类相同,如下所示:
case class NumPair[A <: Numeric](x: A, y: A)
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.但是由于Scala Docs,它Numeric[T]是允许这些操作的唯一特征,并且似乎被扩展Int,Float等等.
有小费吗?