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

时间:2019-04-22 07:34:25

标签: 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
}

Playground

error[E0599]: no method named `downcast_ref` found for type `&std::boxed::Box<(dyn std::any::Any + std::marker::Sync + 'static)>` in the current scope
  --> src/main.rs:18:19
   |
18 |     let res = any.downcast_ref::<X>();
   |                   ^^^^^^^^^^^^

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

为什么编译器不能从downcast_ref()类型的变量any中找到dyn Any方法?

1 个答案:

答案 0 :(得分:1)

这是因为dyn Any + 'static + Sync并没有为dyn Any + 'static实现{}。

  • dyn Any + 'static + Send
  • dyn Any + 'static + Send + Sync
  • {{1}}