```rust trait DefaultParam<R: ?Sized = Self> {} impl<T> DefaultParam for T {} fn foo() -> impl DefaultParam {} trait Super<T: ?Sized> {} impl<T, U> Super<T> for U {} trait Sub: Super<Self> {} impl<T> Sub for T {} fn bar() -> impl Sub {} ``` currently unstable ways: - TAIT - trait aliases