scala java抽象理解_Scala - 抽象类型和隐式参数解析
我正在使用Scala 2.10.4 .
請詳細說明一下 - 實際的代碼深深地嵌入了一個復雜的程序中,所以我不會解釋這個問題,而是以時間的方式抽象出問題來討論動物;-)
在scala我有兩個特征 - 例如:
Animal ,和 HouseBase .
我沒有權利改變Animal,但我繼承了Dog,Rabbit,Fish等類 . 令人討厭的是我不能改變每個子類,因為我沒有擁有我使用的所有子類 .
我的動物都住在某個地方 - 他們的家必須從HouseBase繼承 . 我可以改變HouseBase和它的子類(通過另一層抽象,如果必須的話) .
因此,Dog是Animal的子類,并且將存在于Kennel中,它是HouseBase的子類 .
一只兔子住在一個雙雄,一條魚住在坦克 .
請注意,這里沒有強制執行1:1的關系 - 魚也可以住在池塘里,我們也必須能夠處理它 .
我希望的是 - 給定一個具體的動物(例如Fish),通過抽象類型Animal引用,并給定一個具體的返回類型(例如Tank),Scala將能夠自動選擇正確的隱含參數我在下面的設計 .
object AnimalSelectionProblem extends App {
def abstractFish : Animal = new Fish(true, 20.0)
def concreteFish : Fish = new Fish(false, 30.0)
def abstractDog : Animal = new Dog("tasty bone")
def concreteDog : Dog = new Dog("yummy bone")
def abstractRabbit : Animal = new Rabbit(5)
def concreteRabbit : Rabbit = new Rabbit(10)
import HouseImplicits._
val myTank1: Tank = HouseImplicits.create(abstractFish)
val myTank2: Tank = HouseImplicits.create(concreteFish)
val myKennel1: Kennel = HouseImplicits.create(abstractDog)
val myKennel2: Kennel = HouseImplicits.create(concreteDog) // This works
val myhutch1: Hutch = HouseImplicits.create(abstractRabbit)
val myhutch2: Hutch = HouseImplicits.create(concreteRabbit) // This works
}
但是有2個相關的問題 .
問題1 - 如果動物被引用為摘要,則隱式參數將僅查找采用抽象類型(Animal)而不是基礎具體類型的函數 . 我懷疑解決方案可能是使用ClassTags,因為Scala似乎沒有使用運行時信息?我實現了這個目標并且無可救藥地失去了(我對Scala來說還是新手!) .
問題2 - 如果我的動物可以生活在多種類型的House中,那么會出現類似的問題,即使指定了具體的返回類型,編譯器也會發現Fish的兩個隱含對象不明確 . 我有點難過這里要做什么!
我可以用手動樣板制作解決方案來匹配運行時的類型,但這不是很容易擴展 .
任何想法都感激不盡!其余代碼如下 .
編輯 - 這些鏈接似乎證實了我所懷疑的 . 使用了編譯時多態性,因此無法知道運行時類型:
所以,我想現在我的問題是,鑒于此,有沒有辦法修改我的示例以使用運行時調度?
Animals:
trait Animal {
}
class Dog(val boneName: String) extends Animal
class Rabbit(val length: Int) extends Animal
class Fish(val likesFrogs: Boolean, val optimumTemp: Double) extends Animal
Houses and Implicits:
sealed trait HouseBase
// Made up some arbitrary member variables
case class Kennel(posessions: Seq[String]) extends HouseBase
case class Hutch(length: Int) extends HouseBase
case class Tank(waterTemp: Double) extends HouseBase
case class Pond(containsFrog: Boolean) extends HouseBase
sealed trait HouseCreator[A <: animal hb housebase>
def create(animal: A): HB
}
object HouseImplicits {
implicit object BuildKennelForDog extends HouseCreator[Dog, Kennel] {
override def create(dog: Dog): Kennel = {
new Kennel(Seq(dog.boneName))
}
}
implicit object BuildTankForFish extends HouseCreator[Fish, Tank] {
override def create(fish: Fish): Tank = {
new Tank(fish.optimumTemp)
}
}
implicit object BuildPondForFish extends HouseCreator[Fish, Pond] {
override def create(fish: Fish): Pond = {
new Pond(fish.likesFrogs)
}
}
implicit object BuildHutchForRabbit extends HouseCreator[Rabbit, Hutch] {
override def create(rabbit: Rabbit): Hutch = {
new Hutch(rabbit.length*5)
}
}
def create[A <: animal h housebase a house: housecreator :>
val newHouse = house.create(animal)
newHouse
}
}
總結
以上是生活随笔為你收集整理的scala java抽象理解_Scala - 抽象类型和隐式参数解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java正则题_牛客网java编程题整理
- 下一篇: java将日期作为文件名_获取当前时间作