< 返回版块

AtenJin 发表于 2020-04-19 17:03

Tags:trait, 泛型

例子代码是这样的:

trait A {}

impl<T> A for Vec<T> {}
impl<T: AsRef<u32>> A for T {}

这个示例代码编译报错:

Compiling playground v0.0.1 (/playground)
error[E0119]: conflicting implementations of trait `A` for type `std::vec::Vec<_>`:
 --> src/lib.rs:4:1
  |
3 | impl<T> A for Vec<T> {}
  | -------------------- first implementation here
4 | impl<T: AsRef<u32>> A for T {}
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `std::vec::Vec<_>`
  |
  = note: upstream crates may add a new impl of trait `std::convert::AsRef<u32>` for type `std::vec::Vec<_>` in future versions

error: aborting due to previous error

For more information about this error, try `rustc --explain E0119`.
error: could not compile `playground`.

playground

看了半天资料并搜索没有看懂,最接近的一个回答是这个: Conflicting implementations of trait in Rust

请求大佬解答

评论区

写评论
phper-chen 2020-04-21 10:20

孤儿规则

whfuyn 2020-04-19 20:17
impl<T> A for Vec<T> {}
impl<U: AsRef<u32>> A for U {}

如果未来Vec实现了AsRef,那么Vec就会满足U的要求,从而Vec会有两份A的实现。 这个问题以前遇到过,但没找到一个比较好的解决办法,只能先用个本地的类型把它包一下,比如:

use std::ops::Deref;
trait A {}

struct Wrap<T>(Vec<T>);

impl<T> Deref for Wrap<T> {
    type Target = Vec<T>;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

impl<T> A for Wrap<T> {}
impl<T: AsRef<u32>> A for T {}

fn main() {

}

但我不确定这么做合不合适,有没有比较了解的朋友说一下?

liangyongrui 2020-04-19 19:01

这个报错不是写的很清楚嘛

note: upstream crates may add a new impl of trait `std::convert::AsRef<u32>` for type `std::vec::Vec<_>` in future versions

(未来std::convert::AsRef可能会被std::vec::Vec<_>实现,就冲突了

1 共 3 条评论, 1 页