Mismatched types expected fn pointer `fn(SendStream, RecvStream)` found fn item `fn(SendStream, RecvStream) -> impl Future<Output = ()>

After searching this forum, this thread resembles my problem. However, I don't understand it very well.

My simplified code that goes wrong

fn start(&self, handle: fn(SendStream, RecvStream) -> ()) -> JoinHandle<()> {
    let endpoint = Endpoint::server(self.serv_conf.clone(), self.bind_addr).unwrap();
    tokio::spawn(async move {
        let incomding = endpoint.accept().await.unwrap();
        let conn = incomding.await.unwrap();
        while let Ok((send, recv)) = conn.accept_bi().await {
            handle(send, recv);
        }
    })
}

async fn handle(send: SendStream, recv: RecvStream) {
    #[rustfmt::skip]
    let mut bufs = [
        Bytes::new(), Bytes::new(), Bytes::new(), Bytes::new(),
        Bytes::new(), Bytes::new(), Bytes::new(), Bytes::new(),
        Bytes::new(), Bytes::new(), Bytes::new(), Bytes::new(),
        Bytes::new(), Bytes::new(), Bytes::new(), Bytes::new(),
        Bytes::new(), Bytes::new(), Bytes::new(), Bytes::new(),
        Bytes::new(), Bytes::new(), Bytes::new(), Bytes::new(),
        Bytes::new(), Bytes::new(), Bytes::new(), Bytes::new(),
        Bytes::new(), Bytes::new(), Bytes::new(), Bytes::new(),
    ];

    match recv.read_chunks(bufs).await.expect("msg") {
        Some(usize) => println!("read {}!", usize),
        None => ()
    }
}

// simplified main logic that executes the code
#[tokio::main]
#[test]
async fn my_test() {
    start(handle); // vscode complains mismatched types expected fn pointer `fn(SendStream, RecvStream)` found fn item `fn(SendStream, RecvStream) -> impl Future<Output = ()> here
}

Reading the docs like [1][2], a function pointer in my code is fn(send: SendStream, recv: RecvStream) -> () and fn item is my async fn handle(send: SendStream, recv: RecvStream) { ... }. When passing the name handle as argument to the method start, does not it become fn pointer automatically? Or is it just because the signature difference where my fn item actual returns Future<Output=()>?

How to fix this error? Thanks

[1]. function - In Rust, what is `fn() -> ()`? - Stack Overflow
[2]. Function pointer types - The Rust Reference

In short this is a "what color is your function?" problem.

async fn is not the same as fn. These are approximately the same:

async fn handle(send: SendStream, recv: RecvStream) {
    // body
}

fn handle(send: SendStream, recv: RecvStream) -> impl Future<Item = ()> {
    async move {
        let (send, recv) = (send, recv);
        // body
    }
}

Something like this may work (untested):

fn start<Fut>(&self, handle: fn(SendStream, RecvStream) -> Fut) -> JoinHandle<()>
where
    Fut: Future<Output = ()>,