Scala trait是如何引用实现类的?
例如,我想声明一个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
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
的一种常用方法(几乎所有类型都有)。