簡體   English   中英

為什么可以為`T:Display`和`str`實現特征?

[英]Why is it possible to implement a trait for both `T: Display` and `str`?

穩定的Rust中沒有專業化 ,所以這不起作用:

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 strimpl<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM