首页 > 解决方案 > 为什么我的特征实现在约束到不同的关联类型时会发生冲突?

问题描述

这是一个重现我的问题的玩具示例。

我想根据水坑是清澈还是泥泞来创建不同的 Splash 实现。

编译器告诉我我的 Muddy Splash 和 Clear Splash 冲突。

但是,我无法找到(到目前为止)指定一个类型 P,它使用 Puddle::Purity=Muddy 和 Puddle::Purity=Clear 实现 Puddle。ExamplePuddle 也无法与 Puddle 的冲突 impl 进行编译。

因此,如果我不能为任何类型 P 实现多个不同的 Puddle::Purity,那么为什么我不能为不同的 Puddle::Purity 约束实现不同的 Splash?

trait WaterPurity {}

struct Muddy;
impl WaterPurity for Muddy {}

struct Clear;
impl WaterPurity for Clear {}



trait Puddle {
    type Purity: WaterPurity;
}

trait Splash {}
struct Foot;


// Conflicting implementations of Splash for type (_, Foot)
impl<P> Splash for (P, Foot) where
    P: Puddle<Purity=Muddy> {}
impl<P> Splash for (P, Foot) where
    P: Puddle<Purity=Clear> {}


struct ExamplePuddle;

// Conflicting implementations of trait Puddle for ExamplePuddle
impl Puddle for ExamplePuddle {
    type Purity = Muddy;
}
impl Puddle for ExamplePuddle {
    type Purity = Clear;
}

标签: rusttraitstype-level-computation

解决方案


这是一个悬而未决的问题。根据问题中的评论,专业化可能是一种解决方法。


推荐阅读