4
我们有两个特点A
和B
针对如果两个特征都实现了引用,我如何为所有实现特质A的类型实现特质B?
- 我可以平凡实现
B
为实现A
所有类型。 - 我可以简单地实现
A
以引用任何类型的实现A
。 - 对于引用
B
的任何类型,我可以简单地实施B
。
实际上,所有三个都会导致冲突,因为现在引用实现A
的类型对于它们来说有两个实现B
。其中由于impl<T: A> A for &T
和一个及物动词由于impl<T: A> B for T
(然后impl<T: B> B for &T
。
我不能删除impl<T: B> B for &T
,因为有可能是实现B
类型,但不A
这里是表现出示例代码行为
trait A {}
trait B {}
impl<'a, T: A> A for &'a T {}
impl<T: A> B for T {}
impl<'a, T: B> B for &'a T {}
这将导致以下错误:
error[E0119]: conflicting implementations of trait `B` for type `&_`:
|
| impl<T: A> B for T {}
| --------------------- first implementation here
| impl<'a, T: B> B for &'a T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_`
是否可以使用Rust类型系统来确保当有impl B for &A
时,我们不会为&B
创建一个?
这[博客文章](http://smallcultfollowing.com/babysteps/blog/2016/09/24/intersection-impls/)和[关于它的内部线程](https://internals.rust-lang .org/t/blog-post-intersection-impls/4129)有很多关于它的讨论。一般总结是“尚未”,但可能有一些想法可能有帮助。 –
@ChrisEmerson:也许这是值得让这个答案? –