为什么我的scala代码有些错误?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我的scala代码有些错误?相关的知识,希望对你有一定的参考价值。
cir.moveTo之后不应该变成Circle center:Point(30.0,20.0),R=5.0吗,咋还是Circle center:Point(10.0,10.0),R=5.0
参考技术A你的Circle类派生自Shape,用变量center去初始化point变量,只在第一次初始化进行了值传递,以后你再改变时改变的是point,和center没有关系。你可以尝试打印point就可以看出它确实被改变了
如果你要覆盖Shape的定义,试试在Circle中使用,而不要又换名字又没有override
override var point:Point
追问那我应该如何将point的值赋给center呢
追答不要总想着定义变量,你是用继承和多态,首先你必须确保基类和派生类对象的合理性
首先说Shape,它的point变量到底是代表什么含义呢?不同派生类对这个point变量你的计划如何使用呢?当然这是留给你的思考题
其次:center不一定是一个var,它完全可以是一个def
再次:在构造函数里的var 是很不合理的,似乎在构造函数内用val给成员变量赋值即可,如
class Shape(val pointV:Point)
var point = pointV;
public def moveTo(val pointV: Point) :Unit =
point = pointV;
case class Circle(val pointV:Point, val radiusV:Double) extends Shape(pointV)
def center:Point =
return point;
var radius = radiusV;
带有 Play2.4 和 scala 的 Google Guice 的循环依赖错误
【中文标题】带有 Play2.4 和 scala 的 Google Guice 的循环依赖错误【英文标题】:Circular Dependency Error for Google Guice with Play2.4 and scala 【发布时间】:2015-06-30 13:33:33 【问题描述】:我的应用程序使用 Play 2.4 和 Scala 2.11。我开始转换现有代码以使用 Play 2.4 附带的 Google Guice。
在进行第一组更改后运行我的代码时,我发现我的代码中的一些 DAO 因 循环依赖错误而失败。
例如我有两个 DAO
class BookDAO @Inject()
(protected val personDAO : PersonDAO,
@NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile]
...
...
val personId = //some id
personDAO.get(personId)
class PersonDAO @Inject()
(protected val bookDAO : BookDAO,
@NamedDatabase("mysql")protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile]
...
...
val bookName= //some id
personDAO.getByName(bookName)
我在尝试访问 BookDAO 或 PersonDAO 时遇到以下错误
Tried proxying schema.BookDAO to support a circular dependency, but it is not an interface.
at schema.BookDAO.class(Books.scala:52)
while locating schema.BookDAO
谁能帮我解决这个错误。
提前致谢
【问题讨论】:
【参考方案1】:快速解决方案
改为注入Provider
:
class BookDAO @Inject()(personDaoProvider: Provider[PersonDAO], ...)
extends HasDatabaseConfigProvider[JdbcProfile]
val personDAO = personDaoProvider.get
def person = personDAO.get(personId)
BookDAO
也是如此。这将开箱即用。 Guice 已经“知道”如何注入 Providers。
更好的方法
将类定义与实现分离。请参阅 Mon Calamari 的回答。
【讨论】:
【参考方案2】:如下定义你的依赖,并从类中提取所有需要的方法到特征:
@ImplementedBy(classOf[BookDao])
trait IBookDao
// abstract defs
class BookDao @Inject()(protected val personDAO: IPersonDao, protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] with IBookDao
@ImplementedBy(classOf[PersonDao])
trait IPersonDao
// abstract defs
class PersonDao @Inject()(protected val bookDAO: IBookDao, protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] with IPersonDao
如您所见,每个dao
都实现了一个特征,所有dao
依赖项都由trait
注入。这使Guice
可以注入代理类并解决循环依赖问题。
更多关于playframework scala
依赖注入here的细节。
【讨论】:
以上是关于为什么我的scala代码有些错误?的主要内容,如果未能解决你的问题,请参考以下文章