E4135

E4135#

impl 实现不一致:多个实现具有不同的 self 类型或约束。

为同一类型实现 trait 的不同方法时,所有实现必须在接收者类型和类型参数约束上保持一致。如果两个实现使用不同的约束,那么对于同时满足这两个约束的类型,是否具有完整且一致的实现就不明确。

错误示例#

pub(open) trait I {
  f(Self) -> Unit
  g(Self) -> Unit
}

pub(all) struct P[X](X)

impl[X : Show] I for P[X] with f(_self) {}
impl[X] I for P[X] with g(_self) {}

建议#

解决这个问题的一种方法是让这些实现使用相同的约束:

pub(open) trait I {
  f(Self) -> Unit
  g(Self) -> Unit
}

pub(all) struct P[X](X)

impl[X] I for P[X] with f(_self) {}
impl[X] I for P[X] with g(_self) {}

pub fn use_i(p : P[Int]) -> Unit {
  p.f()
  p.g()
}

如果希望同时支持两种约束,可以创建一个组合这些约束的新 trait,并为每个应满足该约束的类型手动实现这个 trait。