我正在使用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 - 抽象类型和隐式参数解析相关推荐

  1. scala java抽象理解_Scala学习笔记(五) 抽象类以及类中的一些语法糖

    1. 抽象类 Scala 的抽象类跟Java的一样,不能被实例化. 1.1抽象字段 抽象类中,变量不使用就无需初始化,可以等到子类继承时再进行初始化. scala> abstract class ...

  2. scala java抽象理解_Scala之类、特质和抽象类

    1. 类 1.1. 类的定义 类的定义: //定义Point类,构造器带有两个参数 class Point(var x: Int, var y: Int) { //无返回值的类方法 def move( ...

  3. scala java抽象理解_scala – 抽象覆盖如何在Java代码方面起作用?

    它来了: 它简短,抽象覆盖def m()允许从方法调用super.m()并且当一个特征在所有其他类型之后混合时,这个超级调用动态地代替类型创建,例如 trait Printer { def print ...

  4. Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...

    Scala高级特性 1.    学习目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  5. Scala入门到精通——第十八节 隐式转换与隐式参数(一)

    本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在Scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想 ...

  6. 7.scala初识 柯里化、隐式参数、隐式转换、视图边界、上界、下界、协变、逆变

    1.前言: 学过java我们都知道,java中的继承是对类的增强,java中的代理.装饰是对对象方法的增强.而在scala中,隐式转换和隐式参数是Scala中两个非常强大的功能,隐式的对类的方法进行增 ...

  7. 2021年大数据常用语言Scala(三十八):scala高级用法 隐式转换和隐式参数

    目录 隐式转换和隐式参数 隐式转换 自动导入隐式转换方法 隐式转换的时机 隐式参数 隐式转换和隐式参数 隐式转换和隐式参数是scala非常有特色的功能,也是Java等其他编程语言没有的功能.我们可以很 ...

  8. 传递list对象作为参数_24.scala的隐式参数

    方法可以具有 隐式 参数列表,由参数列表开头的 implicit 关键字标记. 如果参数列表中的参数没有像往常一样传递, Scala 将查看它是否可以获得正确类型的隐式值,如果可以,则自动传递. Sc ...

  9. Scala _09样例类(case classes)隐式转换

    样例类(case classes) 概念理解 使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类.实现了类构造参数的getter方法(构造参数默认被声明为val), ...

最新文章

  1. JVM - 剖析Java对象头Object Header之对象大小
  2. 【CV】ECCV2020图像分割开源论文合集
  3. 牛客小白9 换个角度思考(离线+树状数组)
  4. 教你用 Newprep 一键封装工具 封装XP克隆系统- 视频教程
  5. 误删了microsoft visual c++后如何正常运行matlab
  6. dos命令安装windows服务
  7. 12款Javascript表格控件(DataGrid)
  8. 用Dojo实现Ajax请求:XH“.NET研究”R、跨域、及其他
  9. android之wifi开发
  10. MySQL操作(备份很重要)
  11. redis 可视化客户端工具
  12. 智伴机器人wifi键在哪里_智伴机器人连不上WiFi
  13. win10计算机本地组策略编辑器,如何打开Win10本地组策略编辑器?
  14. Asterisk入门教程
  15. 冲奶粉有感 ----与代码的关系
  16. 全球与中国鞋袋市场发展分析与投资策略建议报告2022-2028年
  17. 联发科技嵌入式_联发科技(MTK)嵌入式软件开发一面
  18. 关于信息搜集的部分介绍
  19. Java获取unix时间戳
  20. 学习java的第十三天,回顾方法的定义及调用,以及面向对象构造器、类与对象的关系等基础

热门文章

  1. Centos7.9禁用密码登录
  2. QPixmap、QImage、QPicture、QBitmap四者区别
  3. Python常用命令行(持续更新)
  4. Android生存指南:解Bug策略和思路
  5. 记录MongoDB启动报错MongoDB not running on the provided host and port
  6. c语言mktime,在C语言中转换时间的基本方法介绍
  7. python改变字符串类型_python – Sklearn将字符串类标签更改为int
  8. 不含抽象方法的抽象类 java_Java:抽象类继承非抽象类,且不包含抽象方法有何负面作用吗?...
  9. Pycharm 2018 虚拟环境创建及解释器的设置(小白图解教程)
  10. C/Cpp / #include