日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scala java抽象理解_Scala - 抽象类型和隐式参数解析

發布時間:2024/10/8 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 - 抽象类型和隐式参数解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。