[英]Why is it possible to implement a trait for both `T: Display` and `str`?
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
是為str
實現的 ,所以泛型impl應該實現Show
for str
並與特定的impl沖突。
為什么impl Show for str
與impl<T: Display> Show for T
?
綁定<T: Display>
隱式假定T
必須是Sized類型。 但是str
沒有統一 。 因此,這兩個沖動並不相互沖突。
如果你需要覆蓋像str
這樣的未定義類型,你需要通過添加T: ?Sized
來放寬大小的要求T: ?Sized
:
impl<T: Display + ?Sized> Show for T {}
// ^~~~~~~~
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.