generics - 无法为通用结构实现 Into 特征

标签 generics type-conversion rust

我在执行 Into 时遇到问题Rust 中通用结构的特征。下面是我正在尝试做的简化版本:

struct Wrapper<T> {
    value: T
}

impl<T> Into<T> for Wrapper<T> {
    fn into(self) -> T {
        self.value
    }
}

当我尝试编译时,出现以下错误:

error: conflicting implementations of trait `std::convert::Into<_>` for type `Wrapper<_>`: [--explain E0119]
 --> <anon>:5:1
  |>
5 |> impl<T> Into<T> for Wrapper<T> {
  |> ^
note: conflicting implementation in crate `core`

我的印象是问题出在标准库中的以下实现:

impl<T, U> Into<T> for U where T: From<U>

T 可能实现From<Wrapper<T>> ,这可能是一个冲突的实现。有什么办法可以解决这个问题吗?例如,有没有办法让 impl<T> block 限制 T到不实现 From<Wrapper<T>> 的类型?

最佳答案

实际上...没有办法将其限制为类型 T未实现 From<Wrapper<T>> . Rust 没有“否定”子句。

通常情况下,实现方式Into就是简单地实现From得到 Into 免费。但是,在您的情况下,实现将是:

impl<T> From<Wrapper<T>> for T {
    fn from(w: Wrapper<T>) -> T { w.value }
}

这就违反了孤儿规则。不允许执行 From对于所有 T .

可能有一个技巧,但我在这里看不到。

关于generics - 无法为通用结构实现 Into 特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39186652/

相关文章:

jsf - 使用 c :set to set a non-string value

rust - 在 Rust 中迭代 Vec 的备用元素的最佳方法是什么?

rust - 为什么用==比较两个看似相等的指针可以返回false?

if-statement - 在折叠内部使用 if

scala - val a : Set[Fruit]=Set[Apple]() does not compile, 为什么?如何修复?

c# - 如何将 List<T> 初始化为给定大小(相对于容量)?

Java 泛型类型有特定的注释

java - 为什么隐藏的静态方法在 Sun JDK 6 下编译但在 OpenJDK 6 和 7 下导致编译失败?

c# - 如何在十六进制和十进制之间转换数字

java - 将 ORACLE 数据类型映射到 JAVA 数据类型