2015-10-24 65 views
0

我有以下代碼:重載方法值應用於替代品

case class A[T](a:T, b:Array[Int]) 
object A { 
    def apply[T](aa:T):A[T] = A(aa, Array(1, 2, 3)) 
} 

trait TLike[T] 
case class TSample1[T](str:String) extends TLike[T] 

爲什麼,如果我從A實例化類型,我得到以下錯誤:

object tmp extends App{ 
    val a = A[TLike[TSample1]](TSample1("dumb")) 
} 

錯誤:

overloaded method value apply with alternatives: 
    (a: TLike[TSample1],b: Array[Int])A[TLike[TSample1]] <and> 
    (aa: TLike[TSample1])A[TLike[TSample1]] 
cannot be applied to (TSample1[Nothing]) 
    val a = A[TLike[TSample1]](TSample1("dumb")) 

但是,如果我只是把它留給Scalac它可以正常工作:

object tmp extends App{ 
     val a = A(TSample1("dumb")) 
    } 
+0

什麼是'Type參數'T'您的預期目的TLike'和'TSample'?例如,「TSample [Int]」與「TSample [Char]」有什麼不同?它們都會像寫入的那樣接受'String'參數,但都不是'TSample [String]'或'TLike [String]'類型,既不包含'Int'或'Char'實例。我想知道這個因素是否會影響你在'tmp'中的使用。 – Shadowlands

+0

@Shadowlands我已經簡化了我的代碼,所以我可以問這個問題,我需要特性中的T代碼的其他部分。 – Omid

回答

0

如果我們從編譯的案例開始,您可以調用object Aapply方法,該方法按預期工作。

如果我們以後去無法編譯,並期待在編譯錯誤的例子:

Main.scala:10: error: overloaded method value apply with alternatives: 
(a: TLike[TSample1],b: Array[Int])A[TLike[TSample1]] <and> 
(aa: TLike[TSample1])A[TLike[TSample1]] 
cannot be applied to (TSample1[Nothing]) 
val a = A[TLike[TSample1]](TSample1("dumb")) 
    ^
one error found 

它說,發現兩個apply方法,一個你定義的,一個是標準case class方法(如果需要,請閱讀更多信息)。

我猜你嘗試調用這個方法:

def apply[T](aa:T):A[T] = A(aa, Array(1, 2, 3))

但是你不能調用A對象的應用功能與模板。另一個調用不匹配,因爲它也需要一個數組。 TLike[TSample1]的類型也不等於TSample1

+0

它不應該混淆關於apply方法的參數,因爲一個(case class)有兩個參數params,另一個(object)有一個參數 – Omid

+0

一個'object'被實例化一次,因此你不能使用模板參數來調用它作爲你做。這些類型也是錯誤的。請再次閱讀我的答案中的最後一句話。 –

0

其實很難理解你正試圖在這裏實現什麼,而是你應該考慮兩件事情:

  1. TSample獲取參數,所以Tlike[TSample]是相當複雜類型
  2. ,因爲在參數沒有任何提示的爲TSample.apply參數T應該是什麼類型的,它會被默認

推斷Nothing例如,這將彙編

A[TLike[TSample1[_]]](TSample1[TSample1[_]]("dumb")) 

WHIS也:

A[TLike[Nothing]](TSample1("dumb")) 

後者是等效

A(TSample1("dumb")) 

沒有任何類型的規範

相關問題