說我們有這些嵌套類和A
一個實例:去除類型檢查路徑依賴在斯卡拉
class A {
case object B
case class C(c: Int)
}
val a1 = new A()
現在我可以檢查a1.B
是a1.B.type
實例,但我怎麼能檢查類型a1.B
是的任意一個A#B.type
的實例,因爲編譯器不會接受該語法。
a1.B.isInstanceOf[a1.B.type]
res: Boolean = true
a1.B.isInstanceOf[A#B.type]
<console>:1: error: ']' expected but '.' found.
a1.B.isInstanceOf[A#B.type]
^
對於案例類似乎沒有問題的工作:
a1.C(0).isInstanceOf[a1.C]
res: Boolean = true
a1.C(0).isInstanceOf[A#C]
res: Boolean = true
後續問題:當我有
val a1 = new A()
val a2 = new A()
有,做一個平等的檢查沒有功能考慮路徑依賴性?例如。在比較a1.B
和a2.B
時應該返回true
。例如:
a1.B =#= a2.B
true
a1.C(0) =#= a2.C(0)
true
a1.C(0) =#= a2.C(1)
false
編輯:爲了澄清:只是引入一個共同的特點爲B
是不夠的,因爲我想打賭能情況來區分對象:
class A {
trait BB
case object B1 extends BB
case object B2 extends BB
}
val a1 = new A
val a2 = new A
a1.B1 =#= a2.B1 // should be true
a1.B2 =#= a2.B2 // should be true
a1.B1 =#= a1.B2 // should be false
a1.B1 =#= a2.B2 // should be false
現在,.hashCode
(或.##
)方法似乎解決了這個問題:
a1.B1.## == a2.B1.## // true
a1.B1.## == a2.B2.## // false
但也許它ther e是一個更優雅的解決方案(我也希望能夠在模式匹配中使用a1.B1
)。
您是否在尋找運行時(即後擦除)測試? –
我通過將'case object'移出外部類來解決我的問題,所以它現在更像是一個普遍問題。我想對於運行時值相等檢查,如果沒有更好的方法,可以通過比較'hashCode'來解決。 – Debilski
你想檢查是否應該或'a1.C(0)== a2.C(0)'?如果它應該使用'final case class' –