这里有一个重现我的问题的玩具示例。
我想根据Puddle是透明的还是Muddy的来创建一个不同的Splash实现。
编译器告诉我Muddy Splash和Clear Splash冲突。
然而,(到目前为止)我没有办法指定一个同时使用Puddle::Purity=Muddy和Puddle::Purity=Clear实现Puddle的类型P。ExamplePuddle也无法编译,因为Puddle的隐含存在冲突。
所以,如果我不能为任何类型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;
}发布于 2021-10-12 09:34:58
这是一个open issue。根据问题中的评论,specialization可能是一种变通方法。
https://stackoverflow.com/questions/69538204
复制相似问题