加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 特征和抽象类型

发布时间:2020-12-16 18:48:02 所属栏目:安全 来源:网络整理
导读:假设我有一个基类 abstract class Base { type B: Base def rep:String def copy:B}class MyBase(override val rep:String) extends Base { type B = MyBase override def copy = new MyBase(rep)} 然后我尝试添加另一个特性作为mixin,我希望复制的返回类型
假设我有一个基类

abstract class Base {

  type B<: Base

  def rep:String

  def copy:B
}

class MyBase(override val rep:String) extends Base {
  type B = MyBase

 override def copy = new MyBase(rep)
}

然后我尝试添加另一个特性作为mixin,我希望复制的返回类型是适当的类型(意味着在mixin上调用copy会返回mixin类型,通过将B设置为适当的类型).我无法编译,甚至无法理解override关键字的位置.

编辑:我已经改进了这个例子

abstract class Base {


  type B <: Base

  def rep:String

  def copy:B

}

class MyBase(val rep:String) extends Base {

  type B = MyBase

  def copy = new MyBase(rep)
}


trait DecBase extends Base {

  abstract override def rep = "Rep: "+super.rep   
}

我的问题是,如何为DecBase声明一个合适的B类和复制方法,以便该副本返回一个DecBase,而且,为什么不编译?

println(((new MyBase("ofer") with DecBase)).rep)

这是我在Java中可以实现的(带有一些肮脏,使用递归泛型类型).我确信在Scala中做一些更好的事情是可能的.

编辑

运用

trait DecBase extends Base {

  override type B = DecBase
  abstract override  val rep= "Dec:"+super.rep
  abstract override def copy = new MyBase(rep) with DecBase
}

我得到以下编译器错误

error: overriding type B in class MyBase,which equals com.amadesa.scripts.MyBase;
type B in trait DecBase,which equals com.amadesa.scripts.DecBase has incompatible type
println(((new MyBase("ofer") with DecBase)).rep)

error: overriding type B in class MyBase,which equals com.amadesa.scripts.DecBase has incompatible type
abstract override def copy = new MyBase(rep) with DecBase

解决方法

我假设你的混音看起来像这样

trait MixIn extends Base {
  override B = MixinBase
  override def copy = new MixinBase(rep)
}

我认为MyBase上的覆盖是问题的一部分.这是不必要的,并使编译器感到困惑.

如果Base上的副本实际上有一个实现,需要进行覆盖,则需要告诉编译器使用哪种方法.如果它不明显,它会抛出手并引发错误.试试这个.

val b = new MyBase(rep) with MixIn {
  override def copy = MixIn.super.copy
}

MixIn.super.copy是对您想要的调用.

您可能希望在Scala Class Linearization上查看此页面,以了解在类型中进行方法的竞争实现时会发生什么.

编辑:哦,这是一个完全不同的问题.在MyBase(val rep:String)的情况下是val.您不能使用def覆盖val,因为假定val是不可变的.您可以使用val覆盖def或var,但不能反过来.做了:

trait DecBase extends Base {
  abstract override val rep = "Rep: "+super.rep
}

请在下次包含编译器错误.它使得查看问题变得容易得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读