为什么可以同时为T和Display都实现特征?

时间:2018-09-28 09:24:07

标签: rust

specialization中没有stable Rust yet,因此无法正常工作:

trait X {}

impl<T> X for T {}
impl X for u32 {}  // conflicting implementation

没什么好奇怪的:X适用于任何类型的T,我们不能再次适用于u32

令人惊讶的是,以下代码片段编译成功:

use std::fmt::Display;

pub trait Show {}

impl<T: Display> Show for T {}

impl Show for str {}

// These impls would cause "conflicting implementation" errors:
// impl<'a> Show for &'a str
// impl Show for String

fn main() {}

我不希望因为Display is implemented for str而编译该代码,因此通用impl应该为Show实现str并与特定的impl冲突。

为什么impl Show for strimpl<T: Display> Show for T不冲突?

1 个答案:

答案 0 :(得分:15)

绑定的<T: Display>隐式假定T必须是Sized类型。但是strunsized。因此,这两个推动不会相互冲突。

如果您还需要涵盖诸如str之类的未定义类型,则需要通过添加T: ?Sized来放宽Sized的要求:

impl<T: Display + ?Sized> Show for T {}
//              ^~~~~~~~