在其组件实现Into的泛型类型中实现Into

时间:2018-10-12 16:56:25

标签: rust

我有一个IntPair<T>类型,它在某些元素的类型上是通用的。元素类型T可以是某种最小限制类型(Int64),也可以是某种限制性更大的类型,可以提供更多的保证(Int32,在这种情况下可以保证减少可能的值范围) 。

限制性较高的元素类型实现的Into限制性较小的元素类型。我希望将这种转换概括地带入类型IntPair<T>中,该类型使用其他类型作为元素。

这是一个例子:

pub struct Int32(pub i32);
pub struct Int64(pub i64);
impl Into<Int64> for Int32 {
    fn into(self) -> Int64 {
        Int64(self.0 as i64)
    }
}
pub struct IntPair<T> {
    pub x: T,
    pub y: T,
}
impl<T: Into<Int64>> Into<IntPair<Int64>> for IntPair<T> {
    fn into(self) -> IntPair<Int64> {
        IntPair {
            x: self.x.into(),
            y: self.y.into(),
        }
    }
}
fn main() {
    let p32: IntPair<Int32> = IntPair {
        x: Int32(3),
        y: Int32(9),
    };
    let p64: IntPair<Int64> = p32.into();
}

不幸的是,此代码不起作用。

error[E0119]: conflicting implementations of trait `std::convert::Into<IntPair<Int64>>` for type `IntPair<_>`:
  --> src/main.rs:12:1
   |
12 | impl<T: Into<Int64>> Into<IntPair<Int64>> for IntPair<T> {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: conflicting implementation in crate `core`:
           - impl<T, U> std::convert::Into<U> for T
             where U: std::convert::From<T>;

据我了解,编译器不能保证没有From<IntPair<T>> for IntPair<Int64>的隐含含义,因为Into<IntPair<Int64>> for IntPair<T>不是具体类型,否则将引发IntPair<T>的隐含隐含含义

这很有道理,但我仍希望使用此功能。我能想到的唯一解决方案是创建自己的特征,该特征的行为与Into相同。但是,这并不理想,因为该类型不适用于接受impl Into<IntPair<Int64>>的方法。

有没有一种方法可以使该impl编译?

0 个答案:

没有答案