我有一个用例,我想这样做如何检查方法参数与此方法具有相同的类型?
trait Foo {
def bar[T](x: T)(implicit ev: x.type =:= this.type) = {}
}
是这样,一个电话吧只编译,当参数x具有相同的类型,其中方法被要求的类。
这是明确的,即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)。我还检查了其他的想法就像在this post UPDATE2描述的方法,但在这里自我的协方差不允许定义吧。
存在那里,我没有看到一个解决方案吗?没有使抽象成为泛型(我想避免)。
感谢
在你的例子中'ts1'的类型是'Wrapped',它与'Abstract'无关。它只是碰巧有一个类型为“Abstract”的字段,但它的层次结构中没有任何部分,甚至没有'bar'方法。 – Chirlo
是的,对不起,这是一个错误。当然,我的意思是ts1.a.bar,而不是ts1.bar。 – Klinke