Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala自泛型非法继承_Scala_Oop_Generics_Inheritance - Fatal编程技术网

scala自泛型非法继承

scala自泛型非法继承,scala,oop,generics,inheritance,Scala,Oop,Generics,Inheritance,基本上这就是我想做的。 具有一个成员和另一个继承该成员并初始化该成员的特征。 然后是一个类,它接受必须从第一个trait继承的泛型类型并访问该成员 object main extends App{ val z = new c[b]() z.p() } trait a{ val x : String } trait b extends a { val x = 1 } class c [A <: a] { self: A => def p(): Unit =

基本上这就是我想做的。 具有一个成员和另一个继承该成员并初始化该成员的特征。 然后是一个类,它接受必须从第一个trait继承的泛型类型并访问该成员

object main extends App{
val z =  new c[b]()
  z.p()
}

trait a{
  val x : String
}

trait b extends a {
  val x = 1
}

class c [A <: a]  {
  self: A =>
  def p(): Unit ={
    print(x)
  }
}
c[b]带下划线,编译器抱怨

非法继承,自类型c[b]不符合A


我想定义继承自父特征的多个特征,然后定义一个类,该类接受父-子特征之一并访问其值

我找到了答案,我只需在创建对象时扩展它,如下所示:

object main extends App{
val z =  new c[b] with b
  z.p()
}

trait a{
  val x : String
}

trait b extends a {
  val x = "1"
}

class c[A <: a]{
  this: A =>
  def p(): Unit ={
    print(x)
  }
}
objectmain扩展应用程序{
val z=带b的新c[b]
z、 p()
}
特征a{
val x:字符串
}
特质b延伸到a{
val x=“1”
}
c类[A]
defp():单位={
打印(x)
}
}

在这种情况下,坚持命名约定很有帮助:a)类、特征以大写开头。b)类型参数:单个大写字母c)其他类而不是单个字母。
object main extends App{
val z =  new c[b] with b
  z.p()
}

trait a{
  val x : String
}

trait b extends a {
  val x = "1"
}

class c[A <: a]{
  this: A =>
  def p(): Unit ={
    print(x)
  }
}