繁体   English   中英

TryFrom 的意外冲突实现

[英]Unexpected conflicting implementation for TryFrom

我想在这样的情况下实现特征TryFrom

struct T1;
struct T2(T1);

impl<U> TryFrom<U> for T2 where U: Into<T1> {
    type Error = ();
    fn try_from(val:U) -> Result<T2, Self::Error> {
        unimplemented!();
    }
}

这给了我这个错误:

error[E0119]: conflicting implementations of trait `std::convert::TryFrom<_>` for type `T2`
 --> src/lib.rs:4:1
  |
4 | impl<U> TryFrom<U> for T2 where U: Into<T1> {
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: conflicting implementation in crate `core`:
          - impl<T, U> TryFrom<U> for T
            where U: Into<T>;

这里U实现Into<T1>而不是Into<T2>因此我不太了解错误。 我试图通过实现它来确认没有一揽子实现,它编译时没有冲突:

struct T1;
struct T2(T1);

impl Into<T2> for T1 {
    fn into(self) -> T2 {
        unimplemented!();
    }
}

有什么办法吗? 我不想要这里的默认实现。

特征实现不允许发生冲突。 一个类型完全可以实现Into<T1>Into<T2> 在这种情况下,您的实现会导致歧义,无论是通过内置的一揽子实现还是从您的一揽子实现来使用T: TryFrom<U>实现。 因此存在冲突,编译器会拒绝您的实现。

本质上,由于一揽子实现,您不能通用地实现TryFrom 你无法避免潜在的冲突。

您的确认没有任何意义,因为Into没有这样的全面实施会在T1T2之间发生冲突。 如果您尝试通用地实现它,例如impl Into<T2> for U where U: Into<T1> ,那也是一个问题。 泛型是核心问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM