2013-08-29 169 views
1

,使之短,这个工程:斯卡拉错误执行抽象方法与类型参数

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! TIA!

回答

3

您可能希望定义一个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 
+0

虽然这是一个很好的解决方案,我说,我不想特质类型的参数,我想要推断的函数中的T型。在像这样的简单情况下的特质抽象类型像普通的类类型参数一样工作... –

+0

嗯..有点棘手.. – Shrey

+0

好吧,有一个小的解决方法我已经设法得到我想要的感谢您的答案,我会接受它... –

1

有一个“私人选项” -Yinfer-argument-types,让你:

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

scala> new T { def f(i) = 2 * i } 
res1: T = [email protected] 

您正在寻找一个相当于以下选项的选项:

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

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

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

编辑:也许你的意思是这样的:

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} = [email protected] 

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

上有专门的方法没有Param类型。

更新:这可能会被省略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) 
+0

不知道-Yinfer参数类型,谢谢!不幸的是,当我实例化特征时,给出类型参数正是我想要避免的,考虑到我希望客户端在不给出类型参数的情况下实现该函数(然后使用视图边界进行方差/对比度变换)。对我来说Scala类型推断似乎太多了...... –

+0

@VincenzoMaggio专业化就是你的意图。我的问题,如果它不是你所期望的类型,你会怎么做?答案是:调用另一种方法。至少,专业化是我理解你的问题的唯一方法。 –

+0

只针对原始类型是不是专门化?! –