【问题标题】:Can an object extend abstract class in scala?对象可以在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

提前致谢!

【问题讨论】:

    标签: scala object abstract-class


    【解决方案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

    【讨论】:

    • 什么?你确定你回答的问题是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    相关资源
    最近更新 更多