使用自动特征时,std :: vec :: Vec <_>的实现有冲突

时间:2020-02-20 14:06:00

标签: generics rust

我有2个特征,特征A是特征B的子特征:

pub trait A {...}
pub trait B {...} //A+some methods

对所有非u8都具有自动特征:

pub auto trait IsNotU8 {}
impl !IsNotU8 for u8 {}

用于u8的A的实现:

impl A for Vec<u8> {...}

并且因为对于实现A的所有类型,B中的所有其他方法都无济于事,所以我对实现A的所有类型都实现B:

impl<K: A> B for K {...} //already implemented here

对于Vec:

impl<V: B + IsNotU8> B for Vec<V> {...} //ERROR already implemented

我得到conflicting implementation for `std::vec::Vec<_>`甚至认为第二种实现仅适用于非u8的值,而第一种实现仅适用于实现A的类型。由于只有Vec实现了A,因此这应该不是问题,因为类型重叠。

为什么会出现此错误?当我不使用为A实现B的间接方式时,此方法有效,但事实并非如此。使用自动特征时,这是编译器中的错误吗?

1 个答案:

答案 0 :(得分:0)

虽然在您显示的代码中只有A的{​​{1}}实现,但可以稍后添加它,然后您的Vec<u8>实现会冲突。更一般而言,编译器将始终假定可以在以后添加任何缺少的特征实现(当然,除非您针对某种类型未明确实现的自动特征)。

如果您仍在使用夜间功能,也许可以使用const泛型函数或特征(具有布尔常量)对问题进行建模?