我想定义一个适用于 * 2
的函数对于它的论点,它适用于所有有意义的类型。我尝试使用结构类型:
import scala.language.reflectiveCalls
def double[T](x: Any{def * (arg0: Int): T}) = x * 2
它适用于字符串:
scala> double("a")
res85: String = aa
但不适用于数字:
scala> double(4)
java.lang.NoSuchMethodException: java.lang.Integer.$times(int)
at java.lang.Class.getMethod(Class.java:1778)
at .reflMethod$Method1(<console>:18)
at .double(<console>:18)
... 32 elided
编辑 :“做我想做的事”是指为已经存在的类型(例如数字和字符串)工作,而不仅仅是为我自己定义的类工作。
最佳答案
*
翻译成 $times
, 结构类型检查 *
是否存在方法,但是(我想这是一个错误)调用它的内部( $times
)表示)。这适用于 String
,因为有 $times
为他们。 ``
import scala.language.reflectiveCalls
def double[T](x: Any{def test (arg0: Int): T}) = x.test(2)
class A { def test(i: Int) = i * 10 }
class B { def test(i: Int) = i * 20 }
scala> double(new A)
res0: Int = 20
scala> double(new B)
res1: Int = 40
``
trait Multiply[A]{
def times(a: A, x: Int): A
}
implicit val MultString = new Multiply[String] { def times(a: String, x: Int) = a * x }
implicit val MultInt = new Multiply[Int] { def times(a: Int, x: Int) = a * x }
def double[T](t: T)(implicit mult: Multiply[T]) = mult.times(t, 2)
scala> double("aaaa")
res0: String = aaaaaaaa
scala> double(111)
res1: Int = 222
另请注意,结构类型使用反射 => 非常慢。
关于scala - 如何在 Scala 中定义一个适用于不相关类型的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39413757/