使用类型参数实现抽象方法的Scala错误

时间:2013-08-29 09:39:29

标签: scala type-parameter abstract-methods

简而言之,这有效:

object Main {
  def main(args: Array[String]) {
    trait T1[T] {
      def f1(a: T): Double
    }

    val ea1 = new T1[List[String]] {
      def f1(a: List[String]): Double = a.length
    }
  }
}

但这不会编译:

object Main {
  def main(args: Array[String]) {
    trait T1 {
      def f1[T](a: T): Double
    }

    val ea1 = new T1 {
      def f1(a: List[String]): Double = a.length
    }
  }
}

object creation impossible, since method f1 in trait T1 of type [T](a: T)Double is not defined
    val ea1 = new T1 {
              ^

由于方法上的类型参数,似乎没有考虑该方法。

如何在不使用特征类型参数或特征抽象类型的情况下实现此目的? TIA!

2 个答案:

答案 0 :(得分:4)

您可能希望定义type T以取消特征类型参数并完成相同的操作。

    trait T1 {
      type T
      def f1(a: T): Double
    }

    val ea1 = new T1 {
       type T = List[String]
       def f1(a: T): Double = a.length
    }                                            

    ea1.f1(List("1","2"))  
    // res0: Double = 2.0

答案 1 :(得分:1)

有一个“私人选项”-Yinfer-argument-types可以让您:

scala> trait T { def f(i: Int) }
defined trait T

scala> new T { def f(i) = 2 * i }
res1: T = $anon$1@7915e83

您要求的选项与以下内容相同:

scala> new T { def f() = 2 * i }

除了使用类型参数而不是值参数。

我不确定你的例子中的语义是什么。该方法有一个类型param,但如果它不是我期望的类型则抛出?

编辑:也许你的意思是:

scala> trait T { def f[ @specialized(Int) A](a: A): A = ??? }
defined trait T

scala> new T { def f(i: Int) = 2*i }
res0: T{def f(i: Int): Int} = $anon$1@50844aeb

scala> res7 f 7
warning: there were 1 feature warning(s); re-run with -feature for details
res8: Int = 14

专门方法上没有类型参数。

更新:这可能是SO上第一次出现删除的REPL堆栈跟踪:

scala> res7 f "hi!"
warning: there were 1 feature warning(s); re-run with -feature for details
scala.NotImplementedError: an implementation is missing
  at scala.Predef$.$qmark$qmark$qmark(Predef.scala:229)
  at $anon$1.f(<console>:9)