2017-10-12 92 views
0

我非常新Scala中遇到的奇怪的代碼片段:它構造函數重載嗎?

class EndpointMapper[A](m: Method, e: Endpoint[A]) extends Endpoint[A] { self => 

    /** 
    * Maps this endpoint to either `A => Output[B]` or `A => Future[Output[B]]`. 
    */ 
    final def apply(mapper: Mapper[A]): Endpoint[mapper.Out] = mapper(self) 

    final def apply(input: Input): Endpoint.Result[A] = 
    if (input.request.method == m) e(input) 
    else EndpointResult.Skipped 

    final override def toString: String = s"${ m.toString.toUpperCase } /${ e.toString }" 
} 

這是一類,這樣我就可以創建它的一個實例。 apply怎麼樣?

我可以使用EndpointMapper(mapper)就像調用apply方法的函數嗎?

如何區分兩個應用程序或編譯器如何知道應該調用哪個apply

回答

2

您不能致電EndPointWrapper(mapper) - 因爲apply必須在伴隨對象而不是類中定義。你可以做的是呼叫epw(mapper),其中epwEndPointWrapper的一個實例。

如何區別兩個應用程序或編譯器如何知道,他應該調用哪個應用程序?

它根據參數的類型知道要調用哪個版本的apply,就像其他任何重載方法一樣。