Пока нет никакой специализации в стабильной 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 Show for str не конфликтует с impl<T: Display> Show for T?