是否有可能(以任何方式)将特征对象传递给泛型方法?

Is it possible (in any way) to pass a trait object to a generic method?

我有一个盒装特征对象;我想知道是否可以以任何方式将其传递给绑定泛型类型的方法:

trait Trait {
    fn tmethod(&self) {
        println!("hello");
    }
}

impl Trait for Vec<i32> {}

fn call_tmethod<T: Trait>(t: T) {
    t.tmethod();
}

fn main() {
    let obj: Box<dyn Trait> = Box::new(vec![0]);

    call_tmethod(obj);
}

通常应该没有问题,因为 Box 实现了 AsRef

use core::fmt::Display;


trait Foo {
    fn foo(&self) {
        println!("hello");    
    }
}

impl Foo for i32 {}

fn display<T: Foo>(t: &T) {
    t.foo();
}


fn main() {
    let foo = Box::new(10);
    display(foo.as_ref());
}

Playground

请注意,该方法实际上采用了对对象的引用 &。否则你将不得不实现 &T where T: Foo 的特征,比如:

impl<T: Foo> Foo for &T { ... }