在Scala中,一个对象能否继承抽象类?

5

我是 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

Thanks in Advance !

2个回答

9

你需要为函数提供返回类型,否则它们将返回Unit

abstract class UnitConversions {
  def inchesToCentimeters(inches:Int): Double
  def gallonsToLiters(gallons:Int): Double
  def milesToKilometers(miles:Int): Double
}

我该如何将“您需要为函数提供返回类型”与“抽象类F {def f = 42}”调和起来,然后使“(new F {}).f”返回“res0:Int = 42”? - Kevin Meredith
2
在这种情况下,返回类型是根据实现推断出来的。如果你的抽象类既没有提供默认实现也没有返回类型,那么就假设它是一个“Unit”函数。 - Jean Logeart
感谢 - 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票据要求此类方法具有返回类型? - Kevin Meredith
1
编译器标志是 -Xfuture -deprecation(用于警告),我个人喜欢 -Xfatal-warnings ;-) - Alexandru Nedelcu
谢谢大家。这很有帮助。 - user3619698

0

关于这个问题:

此外,下面的语句是否有效???

var ucv:UnitConversions = new Conversions println(ucv.milesToKilometers(3))

这段代码无法编译。 object 基本上意味着单例,并且可以用于“静态”方法。创建一个单例的实例没有任何意义。请参阅此问题:Scala中对象和类之间的区别


什么?你确定你在回答正确的问题吗? - pedrofurla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接