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 str
与impl<T: Display> Show for T
不冲突?
答案 0 :(得分:15)
绑定的<T: Display>
隐式假定T
必须是Sized类型。但是str
是unsized。因此,这两个推动不会相互冲突。
如果您还需要涵盖诸如str
之类的未定义类型,则需要通过添加T: ?Sized
来放宽Sized的要求:
impl<T: Display + ?Sized> Show for T {}
// ^~~~~~~~