Fiz uma estrutura Vector genérica, usada com diferentes tipos de T:
struct Vector<T> {
data: [T; 3],
}
Já implementei algumas características genéricas para operandos matemáticos ( Eq
, Index
, std::ops::Add
...) e funciona bem.
Mas agora estou lutando para implementar uma From
característica para poder converter facilmente, por exemplo, um vetor em um vetor.
impl<T, U> From<Vector<U>> for Vector<T> {
fn from(item: Vector<U>) -> Self {
// [...]
}
}
Independentemente da from
implementação desta função, recebo o seguinte erro:
error[E0119]: conflicting implementations of trait `From<Vector<_>>` for type `Vector<_>`
--> <source>:5:1
|
5 | impl<T, U> From<Vector<U>> for Vector<T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: conflicting implementation in crate `core`:
- impl<T> From<T> for T;
Se bem entendi é porque por padrão, para qualquer tipo, From<Vector<T>> for Vector<T>
já está declarado. E minha implementação entra em conflito com ela se T
e U
forem tipos idênticos.
Então, existe uma maneira de usar minha implementação para tipos diferentesT
and U
, mas não usá-la para tipos idênticosT
and U
?
Você não pode escrever esta implementação.
Mesmo se você fosse o proprietário de
From
você não poderia escrever esse limite, pois entra em conflito comimpl<T> From<T> for T
whereT == U
. Na verdade, algumas pessoas querem que a biblioteca padrão escreva este impl para coleções (por exemplo,Option<T>
), e apesar da biblioteca padrão ser a proprietária dela,From
não pode fornecer este impl.Você pode fornecer um método para fazer isso, em vez de uma implementação de característica.