scala - 如何在 Scala 中定义一个适用于不相关类型的函数?

标签 scala types

我想定义一个适用于 * 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/

    相关文章:

    java - 使用原始类型实现通用接口(interface)

    c - 数据类型问题导致值不是 "assignable."可能是指针问题?

    java - 从 scala 控制台启动 scala uber-jar

    java - 如何在 Scala 中从 JSON 解析通用类参数?

    scala - 检查特定标识符是否存在于其他数据框中

    java - Apache POI 图像比例图像

    scala - 默认情况下,IntelliJ Idea与SBT一起编译

    types - 要统一的类型变量出现在类型中

    java - 如何从具有不同值类型的Map中获取值? ( java )

    dart - 是否有比较通用静态 Dart 类型 (DartType) 的简单方法?