假設,我們有一個抽象類和抽象類型字段:如何區分具有不同抽象類型字段的對象?
abstract class A {type T}
現在讓我們假設,我們有一個方法,它返回A
類型的對象,但類型字段T
可能會有所不同。我們如何區分這些對象?
我們可以嘗試進行模式匹配:
object Test {
def tryToDistinguish(a: A) =
a match {
case b: A {type T = String} => println("String type")
case b: A {type T = Int} => println("Int type")
case b: A => println("Other type")
}
}
但是,編譯器會抱怨:
$>scalac -unchecked Test.scala
Test.scala:8: warning: refinement example.test.A{type T = String} in type patter
n example.test.A{type T = String} is unchecked since it is eliminated by erasure
case b: A {type T = String} => println("String type")
^
Test.scala:9: warning: refinement example.test.A{type T = Int} in type pattern e
xample.test.A{type T = Int} is unchecked since it is eliminated by erasure
case b: A {type T = Int} => println("Int type")
^
two warnings found
看來類型字段的類型將被擦除被刪除(側問題:因爲類型字段被轉換爲Java中的參數類型?)
因此,這將不起作用:
scala> Test.tryToDistinguish(new A {type T = Int})
String type
替代方案:我們可以alternativley創建一個枚舉,爲了區分放置物體的附加字段中的類A
。但是,這味道,因爲這意味着我們重新實現類型系統。
問題:有沒有辦法區分不同類型的對象類型的幫助下類型字段?如果不是,那麼什麼是一個好的解決方法?
謝謝。如何調用<%<'?我想在Scala文檔中閱讀更多關於它的內容。 –
同樣在這裏,你能解釋一下''<<<'''和''隱式''的直觀語義是什麼? –
該文檔http://www.scala-lang.org/api/current/index.html#scala.Predef$$$less$colon$less – pedrofurla