2013-08-29 336 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

只針對原始類型是不是專門化?! –