【问题标题】:Compiler error - covariant return type vs abstract override编译器错误 - 协变返回类型与抽象覆盖
【发布时间】:2015-03-06 01:44:09
【问题描述】:

我有一个部分处理类型层次结构的程序。我在这里想要实现的只是让'oldType' def 使用我从 Java 中习惯的协变返回类型特性。

trait NumericMember extends  NumericTypedef{ }

trait Type
trait NumericType extends Type

trait Typedef     { def oldType : Type }

class TypedefImpl  extends  Typedef { 
  //can't use a val since it will get overriden
  def oldType : Type = ???
}

trait NumericTypedef extends Typedef with NumericType { 
  abstract override def oldType : NumericType =    super.oldType.asInstanceOf[NumericType] 
}

class NumericTypedefImpl extends TypedefImpl with NumericTypedef{ }

class NumericMemberImpl  extends  NumericMember {
  private val autoType = new NumericTypedefImpl
  override def oldType: NumericType = autoType.oldType
} 

编译器盲目地告诉我 NumericMemberImpl 中的 oldType 需要是一个抽象覆盖,然后当我服从它时改变主意,发现 NumericMemberImpl 实际上是一个类。

我可能在这里走错了路,因为我意识到抽象覆盖用于堆叠特征。当我只想拥有 oldType 的通用和专用返回值时。

帮忙,有人吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    我在这里跳过了所有类的东西,但想法是:

    trait Type
    trait NumericType extends Type 
    
    trait Typedef { def oldType : Type }
    
    class NumericMember extends Typedef {
        def oldType: NumericType = new NumericType{}
    }
    

    返回类型在 scala 和 java 中已经是协变的。您不需要任何显式的类型转换。

    关于这个:

    trait NumericTypedef extends Typedef with NumericType { 
      override def oldType : NumericType =    super.oldType.asInstanceOf[NumericType] 
    }
    

    没有什么可以覆盖的,因为 Typedef 和 NumericType 都没有oldType 的具体实现。实现方法也没有super-class(这是抽象覆盖推荐的原因)。抽象覆盖用于访问super 尚未实现的方法(但将在具体类中)。您不需要太多,因为您不需要调用 super 来获得正确的类型。

    要实现一些自定义类型提供程序:

    abstract class NumericMember extends Typedef
    
    trait  MyNumericTypeProvider extends Typedef { 
       def oldType = new NumericType{} 
    }
    
    trait  MyNumericTypeProvider2 extends Typedef { 
       def oldType = new NumericType{} 
    }
    
    scala> new NumericMember with MyNumericTypeProvider
    res0: NumericMember with MyNumericTypeProvider = $anon$1@19a26a1
    
    scala> new NumericMember with MyNumericTypeProvider2
    res1: NumericMember with MyNumericTypeProvider2 = $anon$1@16bdcbe5
    
    scala> res0.oldType
    res2: NumericType = MyNumericTypeProvider$$anon$1@2be1fa9c
    

    查看res2: NumericType - scala 的类型推断自动找到关于协方差的正确类型。

    【讨论】:

    • 所以我不需要在 NumericTypedef 中覆盖。很确定java会需要它,因此我最初的方法不正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2015-07-29
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多