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。