为什么找不到 dyn Any 类型的 downcast_ref 方法?

Web*_*rix 5 casting rust

我正在尝试创建自己的模拟框架,但遇到了这个问题。当我尝试向下转换我的Any类型时,它找不到downcast_ref方法:

use std::any::Any;
use std::collections::HashMap;

struct X;
struct Y;

fn main() {
    let mut map: HashMap<&'static str, Box<Any + Sync>> = HashMap::new();
    map.insert("x", Box::new(X));
    map.insert("y", Box::new(Y));

    get_x(map);
}

fn get_x(map: HashMap<&'static str, Box<Any + Sync>>) {
    let ref any = map["x"];
    let res = Any::downcast_ref::<X>(any); // Works
    let res = any.downcast_ref::<X>();     // Fails
}
Run Code Online (Sandbox Code Playgroud)

操场

use std::any::Any;
use std::collections::HashMap;

struct X;
struct Y;

fn main() {
    let mut map: HashMap<&'static str, Box<Any + Sync>> = HashMap::new();
    map.insert("x", Box::new(X));
    map.insert("y", Box::new(Y));

    get_x(map);
}

fn get_x(map: HashMap<&'static str, Box<Any + Sync>>) {
    let ref any = map["x"];
    let res = Any::downcast_ref::<X>(any); // Works
    let res = any.downcast_ref::<X>();     // Fails
}
Run Code Online (Sandbox Code Playgroud)

如果我使用关联的函数语法调用它,它会找到该函数并正常工作。

为什么编译器不能找到downcast_ref()从变量法any这是一种dyn Any类型?

Sta*_*eur 2

这是因为Any::downcast_ref()没有为 实现dyn Any + 'static + Sync,仅针对:

  • dyn Any + 'static
  • dyn Any + 'static + Send
  • dyn Any + 'static + Send + Sync

  • @PeterHall:我在[问题中](https://github.com/rust-lang/rust/issues/18737)发现了一个有趣的讨论,其中 Niko 引入了“Any + Send”的实现。“子类型”关系中似乎存在一个限制,它阻止从“Any + Sync”中剥离“Sync”来考虑“Any”上的实现。它似乎更多的是一种实现限制,而不是基本类型系统限制。 (2认同)