Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 trait是如何引用实现类的?_Scala - Fatal编程技术网

Scala trait是如何引用实现类的?

Scala trait是如何引用实现类的?,scala,Scala,例如,我想声明一个trait,实际上是这样的,“如果类C实现了这个trait,那么它有一个方法m,该方法返回类C的一个实例” 我能想到的所有方法都是说,m返回一个具有该特性的实例,这根本不是我想要的。如果我正确理解了你的问题,你一定在寻找类似这样的东西: trait Foo[T] { def m: T } class A extends Foo[A] { def m = { getInstanceOfAFromSomewhere() } } class B extends

例如,我想声明一个trait,实际上是这样的,“如果类
C
实现了这个trait,那么它有一个方法
m
,该方法返回类
C
的一个实例”


我能想到的所有方法都是说,
m
返回一个具有该特性的实例,这根本不是我想要的。

如果我正确理解了你的问题,你一定在寻找类似这样的东西:

trait Foo[T] {
  def m: T
}

class A extends Foo[A] {
  def m = {
    getInstanceOfAFromSomewhere()
  }
}

class B extends Foo[B] {
  def m = {
    getInstanceOfBFromSomewhere()
  }
}
测试:

object Test extends App {
  val a: Foo[_] = new A
  println(a.m)

  val b: Foo[_] = new B
  println(b.m)
}
输出:

A@3d246f44
B@14a1373f

希望这就是你要找的

如果我正确理解了你的问题,你一定在找这样的东西:

trait Foo[T] {
  def m: T
}

class A extends Foo[A] {
  def m = {
    getInstanceOfAFromSomewhere()
  }
}

class B extends Foo[B] {
  def m = {
    getInstanceOfBFromSomewhere()
  }
}
测试:

object Test extends App {
  val a: Foo[_] = new A
  println(a.m)

  val b: Foo[_] = new B
  println(b.m)
}
输出:

A@3d246f44
B@14a1373f
希望这就是你想要的

你这样约束“自我类型”:

scala>trait Foo[Self]{Self:Self=>defm:Self}
定义特征Foo
scala>class A扩展了Foo[A]{def m=new A}
定义的A类
scala>类B扩展了Foo[A]{defm=new B}
:27:错误:非法继承;
自身类型B与Foo[A]的自身类型Foo[A]不一致
类B扩展了Foo[A]{defm=new B}
^
:27:错误:类型不匹配;
发现:B
所需:A
类B扩展了Foo[A]{defm=new B}
^
scala>类B扩展了Foo[B]{defm=newa}
:27:错误:类型不匹配;
发现:A
所需:B
类B扩展了Foo[B]{defm=newa}
您可以这样约束“自我类型”:

scala>trait Foo[Self]{Self:Self=>defm:Self}
定义特征Foo
scala>class A扩展了Foo[A]{def m=new A}
定义的A类
scala>类B扩展了Foo[A]{defm=new B}
:27:错误:非法继承;
自身类型B与Foo[A]的自身类型Foo[A]不一致
类B扩展了Foo[A]{defm=new B}
^
:27:错误:类型不匹配;
发现:B
所需:A
类B扩展了Foo[A]{defm=new B}
^
scala>类B扩展了Foo[B]{defm=newa}
:27:错误:类型不匹配;
发现:A
所需:B
类B扩展了Foo[B]{defm=newa}

也就是说,但我的问题是,如果我键入
class B Extendes Foo[A]
,会发生什么?我能不能把它当作编译器错误呢?我想这应该是有类型证据的,但我实际上不知道你如何才能为你的Google fu做到这一点:这被称为F-有界多态性,是在没有类型证据的语言中模拟
Mytype
的一种常用方法(这几乎是所有类型证据)。也就是说,但我的问题是,如果我键入
classebextendsfoo[A]
,会发生什么?我能不能把它当成编译器错误呢?我想这应该是有类型证据的,但我实际上不知道你如何才能为你的Google fu做到这一点:这被称为F-有界多态性,是在没有类型证据的语言中模拟
Mytype
的一种常用方法(几乎所有类型都有)。