具有关联类型的别名特征
Aliasing trait with associated types
是否可以创建具有指定关联类型的特征别名?我正在使用来自类似问题 Type alias for multiple traits
的方法
trait Trait {
type Item;
}
fn print<T>(value: T) where T: Trait<Item=char> {
}
trait Alias: Trait {}
impl<T: Trait<Item=char>> Alias for T {}
fn print_alias<T: Alias>(value: T) {
print(value)
}
fn main() {
}
但是编译失败并出现以下错误:
<anon>:12:5: 12:10 error: type mismatch resolving `<T as Trait>::Item == char`:
expected associated type,
found char [E0271]
<anon>:12 print(value)
^~~~~
<anon>:12:5: 12:10 note: required by `print`
<anon>:12 print(value)
^~~~~
error: aborting due to previous error
围栏link:http://is.gd/LE4h6a
您仍然需要在 print_alias
方法中指定关联类型:
fn print_alias<T>(value: T)
where T: Alias<Item=char>
{
print(value)
}
问题是您指定每个 Trait<Item=char>
也实现 Alias
(因此 Alias<Item=char>
),但这并不意味着每个 Alias
实现 Trait<Item=char>
!
您目前只要求Alias
的所有值必须实现Trait
,而不是Item
的类型必须是char
。为此,您必须使用以下内容:
trait Alias: Trait<Item=char> {}
@Shepmaster的方案解决了本地问题;但是您每次都必须指定 where T: Alias<Item=char>
。或者,您可以通过要求所有 Alias
实现 Trait<Item=char>
:
来全局解决它
trait Alias: Trait<Item=char> {}
impl<T: Trait<Item=char>> Alias for T {}
首选全局解决方案还是本地解决方案完全取决于您。
是否可以创建具有指定关联类型的特征别名?我正在使用来自类似问题 Type alias for multiple traits
的方法trait Trait {
type Item;
}
fn print<T>(value: T) where T: Trait<Item=char> {
}
trait Alias: Trait {}
impl<T: Trait<Item=char>> Alias for T {}
fn print_alias<T: Alias>(value: T) {
print(value)
}
fn main() {
}
但是编译失败并出现以下错误:
<anon>:12:5: 12:10 error: type mismatch resolving `<T as Trait>::Item == char`:
expected associated type,
found char [E0271]
<anon>:12 print(value)
^~~~~
<anon>:12:5: 12:10 note: required by `print`
<anon>:12 print(value)
^~~~~
error: aborting due to previous error
围栏link:http://is.gd/LE4h6a
您仍然需要在 print_alias
方法中指定关联类型:
fn print_alias<T>(value: T)
where T: Alias<Item=char>
{
print(value)
}
问题是您指定每个 Trait<Item=char>
也实现 Alias
(因此 Alias<Item=char>
),但这并不意味着每个 Alias
实现 Trait<Item=char>
!
您目前只要求Alias
的所有值必须实现Trait
,而不是Item
的类型必须是char
。为此,您必须使用以下内容:
trait Alias: Trait<Item=char> {}
@Shepmaster的方案解决了本地问题;但是您每次都必须指定 where T: Alias<Item=char>
。或者,您可以通过要求所有 Alias
实现 Trait<Item=char>
:
trait Alias: Trait<Item=char> {}
impl<T: Trait<Item=char>> Alias for T {}
首选全局解决方案还是本地解决方案完全取决于您。