我有一个用例,我想做类似的事情
trait Foo {
def bar[T](x: T)(implicit ev: x.type =:= this.type) = {}
}
因此,只有当参数 x 与调用该方法的类具有相同类型时,才会编译对 bar 的调用。
很明显,this.type 在这种情况下没有帮助,因为每个实例都有不同的 this.type,这应该只是说明目标。
完整的问题如下所示:
trait Foo {
def bar[B <: Foo](o: B) = {} // with some check added
}
abstract class Abstract extends Foo
class Concrete1 extends Abstract
class Concrete2 extends Abstract
case class Wrapped(a: Abstract)
val c1a = new Concrete1
val c1b = new Concrete1
val c2 = new Concrete2
val ts1 = new Wrapped(new Concrete1)
c1a.bar(c1b) // should compile
ts1.a.bar(c1b) // should also compile
c2.bar(c1b) // should not compile
使用抽象类型,我找到了一个解决方案,它编译 c1a.bar(c1b) 并且不按预期编译 c2.bar(c1b),但也不编译 ts1.a.bar(c1b)。我还检查了其他想法,例如本文的 update2 中描述的方法,但是这里 Self 的协方差不允许定义 bar。
是否存在我没有看到的解决方案?没有使 Abstract 成为泛型类型(我想避免)。
谢谢