对象可以在scala中扩展抽象类吗?
Posted
技术标签:
【中文标题】对象可以在scala中扩展抽象类吗?【英文标题】:Can an object extend abstract class in scala? 【发布时间】:2017-01-30 01:02:48 【问题描述】:我是 scala 的新手。我正在尝试创建一个扩展抽象类的对象,如下所示
object Conversions extends UnitConversions
override def inchesToCentimeters(inches:Int) = inches * 2.5
override def gallonsToLiters(gallons:Int) = gallons * 3.78
override def milesToKilometers(miles:Int) = miles * 1.6
abstract class UnitConversions
def inchesToCentimeters(inches:Int)
def gallonsToLiters(gallons:Int)
def milesToKilometers(miles:Int)
当我尝试访问对象的成员函数时,我得到 () 这个表达式作为输出。
Conversions.milesToKilometers(20) //I get output ()
下面的说法是否有效???
var ucv:UnitConversions = new Conversions
println(ucv.milesToKilometers(3)) // I get output () here as well
提前致谢!
【问题讨论】:
【参考方案1】:您需要为函数提供返回类型,否则它们返回Unit
:
abstract class UnitConversions
def inchesToCentimeters(inches:Int): Double
def gallonsToLiters(gallons:Int): Double
def milesToKilometers(miles:Int): Double
【讨论】:
如何协调You need to provide a return type for the functions
与:abstract class F def f = 42
,然后:(new F ).f
返回:res0: Int = 42
`
在这种情况下,返回类型是从实现中推断出来的。如果您的抽象类不提供默认实现或返回类型,则假定它是Unit
函数。
谢谢 - abstract class G def g
。然后,class GImpl extends G override def g: Int = 42
编译失败:error: overriding method g in class G of type => Unit;
。任何编译器标志,或者,我推测,scala 票要求此类方法的返回类型?
编译器标志是 -Xfuture -deprecation(用于警告),我个人喜欢 -Xfatal-warnings ;-)
谢谢大家。它有帮助【参考方案2】:
关于这个问题:
下面的说法是否有效???
var ucv:UnitConversions = new Conversions println(ucv.milesToKilometers(3))
这不会编译。 object
基本上表示单例,可用于“静态”方法。创建多个单例实例是没有意义的。看看这个问题:Difference between object and class in scala
【讨论】:
什么?你确定你回答的问题是正确的吗?以上是关于对象可以在scala中扩展抽象类吗?的主要内容,如果未能解决你的问题,请参考以下文章