Нет специализации в Стабильный 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
для str
и конфликтовать с конкретным импл.
Почему impl Show for str
не конфликтует с impl<T: Display> Show for T