我有一個用例,我想這樣做如何檢查方法參數與此方法具有相同的類型?
trait Foo {
def bar[T](x: T)(implicit ev: x.type =:= this.type) = {}
}
是這樣,一個電話吧只編譯,當參數x具有相同的類型,其中方法被要求的類。
這是明確的,即this.type不會在這種情況下幫助,因爲每個實例有一個不同的this.type,這應該只是說明的目的。
完整的問題是這樣的:
trait Foo {
def bar[B <: Foo](o: B) = {} // with some check added
}
abstract class Abstract extends Foo
class Concrete1 extends Abstract
class Concrete2 extends Abstract
case class Wrapped(a: Abstract)
val c1a = new Concrete1
val c1b = new Concrete1
val c2 = new Concrete2
val ts1 = new Wrapped(new Concrete1)
c1a.bar(c1b) // should compile
ts1.a.bar(c1b) // should also compile
c2.bar(c1b) // should not compile
使用抽象類型我發現,編譯c1a.bar(C1B),並不會編譯c2.bar(C1B)如預期的解決方案,也沒有按編譯ts1.a.bar(c1b)。我還檢查了其他的想法就像在this post UPDATE2描述的方法,但在這裏自我的協方差不允許定義吧。
存在那裏,我沒有看到一個解決方案嗎?沒有使抽象成爲泛型(我想避免)。
感謝
在你的例子中'ts1'的類型是'Wrapped',它與'Abstract'無關。它只是碰巧有一個類型爲「Abstract」的字段,但它的層次結構中沒有任何部分,甚至沒有'bar'方法。 – Chirlo
是的,對不起,這是一個錯誤。當然,我的意思是ts1.a.bar,而不是ts1.bar。 – Klinke