2013-06-28 81 views
0

我有一個特點如下:類型不匹配發現

trait SomeBaseTrait{ 
    def someFun[B](args:SomeArgs)(f: => B):B 
} 

在我的測試類,我想如下嘲笑這個類:

class MyMockOfBase extends SomeBaseTrait{ 
    def someFun[Boolean](args:SomeArgs)(f: => Boolean):Boolean = true 
} 

這裏的問題是,編譯這個類拋出以下內容:

[error] found : scala.Boolean(true) 
[error] required: Boolean 
[error] def someFun[Boolean](args:SomeArgs)(f: => Boolean):Boolean = true 
[error]                ^
[error] one error found 

編輯。

而且,事情也有點怪異,當我的特質有一個方法如下:

trait SomeBaseTrait2{ 
    def someFun2[B](args:SomeArgs):B 
    } 

我延伸它,如下所示:

val mockBase = new SomeBaseTrait2{def someFun2(args:SomeArgs):Boolean = true} 

現在,這裏我得到以下幾點:

new SomeBaseTrait2{def someFun2(args:String):Boolean = true} 
<console>:9: error: object creation impossible, since method someFun2 in trait SomeBaseTrait2 of type [B](args: String)B is not defined 
       new SomeBaseTrait2{def someFun2(args:String):Boolean = true} 

有人可以告訴我我可能會在這裏做錯嗎?

+0

可能重複[Scala的類型參數錯誤,而不是一個類型參數的成員(http://stackoverflow.com/questions/16489716/scala -type-parameter-error-not-a-member-of-type-parameter) – senia

回答

1

在你的類MyMockOfBaseBoolean是類型參數的名字,就像T

class MyMockOfBase extends SomeBaseTrait{ 
    def someFun[T](args:SomeArgs)(f: => T):T= true 
} 

您正在嘗試使用trueT

我猜你想要做這樣的事情:

trait SomeBaseTrait[B]{ 
    def someFun(args:SomeArgs)(f: => B):B 
} 

class MyMockOfBase extends SomeBaseTrait[Boolean]{ 
    def someFun(args:SomeArgs)(f: => Boolean):Boolean = true 
} 
+0

謝謝。當我重讀我的問題時,我意識到它是不完整的,因爲你指出shadowing是導致這個特定錯誤的原因,但是當我在我的特質中使用方法def someFun2 [B](args:SomeArgs)時,事情有點不可思議:B。我的編輯將闡述我觀察到的內容。 –

+0

@sc_ray:都是一樣的。 'SomeBaseTrait2'的方法'someFun2'應該有一個類型參數。您可以指定具體類型而不是帶繼承的類型參數,僅適用於特徵或類的類型參數,而不適用於方法的類型參數。只有在您調用方法時才能指定方法的類型參數。你應該從我的答案中使用'特質SomeBaseTrait [B]'。 – senia

+0

謝謝。但是如果我不想將我的基本特徵與特定類型聯繫起來呢? –

相關問題