我有以下代碼。我已經開始學習Scala,所以可能會有更好的方法來做這些事情,但我想學習它的每一點。如果代碼看起來很幼稚,請耐心等待。scala.Some不能轉換爲自定義對象
class ColaProduct() extends Product{
override def productName = "Cola"
override def productDetails = "Chilled Cola"
override def toString(): String = super.toString()
}
class MilkProduct() extends Product{
override def productName = "Milk"
override def productDetails = "Healthy Milk"
override def toString(): String = super.toString()
}
trait Machine {
private val productMap = scala.collection.mutable.Map[String, Product]()
def addProduct(product: Product): Unit ={
productMap += product.productName.toString -> product
}
def checkAvl(name :String): Product ={
if(productMap contains(name)){
return productMap.get(name).asInstanceOf[Product]
} else null
}
def process(name :String)
}
class VendingMachineImpl() extends Machine{
override def process(name : String): Unit ={
val product = checkAvl(name)
if(null !=product){
print("Got you :"+product.toString())
}
}
}
trait Product {
private val defaultString: String = "Default"
def productName = defaultString
def productDetails = defaultString
override def toString(): String = {
return productName + " || " + productDetails
}
}
def main(args : Array[String]): Unit ={
val vendingMachineImpl = new VendingMachineImpl()
vendingMachineImpl.addProduct(new ColaProduct)
vendingMachineImpl.addProduct(new MilkProduct)
vendingMachineImpl.process("Cola")
}
例外:
Exception in thread "main" java.lang.ClassCastException: scala.Some cannot be cast to Product
at vendingMachine$Machine$class.checkAvl(vendingMachine.scala:27)
at vendingMachine$vendingMachineImpl.checkAvl(vendingMachine.scala:33)
at vendingMachine$vendingMachineImpl.process(vendingMachine.scala:35)
at vendingMachine$.main(vendingMachine.scala:47)
我相信是有一次我與指定類型定義map
我沒有一次匹配從地圖檢索值。如果不是,請讓我知道這裏出了什麼問題,這種理解是否正確?
所以如果我正確地理解它總是地圖給我一個選項[T],所以它不是強制性的指定地圖將包含的類型。這只是從可讀性的角度來看? – Helios
在JVM上實現的Scala與Java一樣具有類型擦除功能:在運行時,「Option」只是一個「Option」。然而,在編譯時,知道你有一個'Option [Product]'是非常有用的(它會幫助編譯器爲你捕獲許多可能的錯誤)。如果你有'Map [String,Product]',如果你沒有做任何奇怪的事情,你可以保證'Map.get(String)'將返回一個'Option [Product]'而不是'Option [SomeOtherType]',這很好知道(並且會幫助編譯器幫助你)。 –
此外,我編輯我的答案與其他可能性,以獲得從'地圖'的值。 –