pub trait IntoOwner<Borrowed, Owner>: Sized + Borrow<Borrowed>
where
Borrowed: ?Sized,
Owner: Borrow<Borrowed>,
{
fn into_owner(self) -> Owner;
}
// e.g. into_owner(&T) -> T::Owned
impl<Borrower, Borrowed> IntoOwner<Borrowed, Borrowed::Owned> for Borrower
where
Borrower: Borrow<Borrowed>,
Borrowed: ?Sized + ToOwned,
{
default fn into_owner(self) -> Borrowed::Owned {
self.borrow().to_owned()
}
}
// e.g. into_owner(String) -> String
impl<Borrowed> IntoOwner<Borrowed, Borrowed::Owned> for Borrowed::Owned
where
Borrowed: ?Sized + ToOwned,
{
default fn into_owner(self) -> Borrowed::Owned {
self
}
}
// specializes `for Borrowed::Owned`?
impl<Borrowed> IntoOwner<Borrowed, Borrowed::Owned> for Cow<'_, Borrowed>
where
Borrowed: ?Sized + ToOwned,
{
fn into_owner(self) -> Borrowed::Owned {
self.into_owned()
}
}
error[E0119]: conflicting implementations of trait `IntoOwner<_, _>` for type `std::borrow::Cow<'_, _>`
--> src/lib.rs:36:1
|
26 | impl<Borrowed> IntoOwner<Borrowed, Borrowed::Owned> for Borrowed::Owned
| ----------------------------------------------------------------------- first implementation here
...
36 | impl<Borrowed> IntoOwner<Borrowed, Borrowed::Owned> for Cow<'_, Borrowed>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `std::borrow::Cow<'_, _>`
Is there a real conflict here that I'm overlooking, or is this just a limitation of the currently incomplete #![feature(specialization)]
? It feels like the impl ... for Cow
should be more specific than the impl<Borrowed> ... for Borrowed::Owned
.
Also I'm pretty sure that the type which both impls would apply to is impossible to define, as it would require a recursive, infinitely sized Cow<'_, X>
to have X: ToOwned<Owned=Cow<X>>
.