답변:
몇 가지 일이 있습니다.
첫째, 스칼라는 많은 메소드 호출에서 점과 파렌을 생략 할 수 있도록 20 seconds
합니다.20.seconds()
* .
둘째, "암시 적 변환"이 적용됩니다. 이후 20
입니다 Int
그리고 Int
더없는 seconds
방법, 소요 암시 적 변환에 대한 컴파일러 검색 Int
반환 뭔가 가지고 을seconds
당신의 메서드 호출의 범위에 의해 제약을 검색하여, 방법.
DurationInt 를 범위로 가져 왔습니다 . 매개 변수 DurationInt
가있는 암시 적 클래스 이므로 Int
생성자가 암시 적 Int => DurationInt
변환을 정의합니다 . DurationInt
이 seconds
그것을 만족하여 모든 검색 기준, 방법. 따라서 컴파일러는 호출을 new DurationInt(20).seconds
** 로 다시 작성합니다 .
* 나는 이것을 느슨하게 의미합니다. 20.seconds()
때문에 실제로 잘못된 seconds
방법은 어떤 매개 변수 목록이 없습니다 따라서는 괄호 해야합니다 메소드 호출에서 생략 .
** 실제로 이것은 DurationInt
값 클래스 이기 때문에 사실이 아니므로 가능한 경우 컴파일러는 정수를 줄 바꿈하지 않습니다.
new DurationInt(20).seconds()
방법을 아는 한 훨씬 읽기 쉽습니다 )
seconds
메소드는 parens없이 정의되므로 parens를 사용하여 호출하면 오류가 발생합니다.
20.seconds()
스칼라로 작성할 수 있다고 제안하는 것은 아니며 컴파일러가 호출을 그런 식으로 번역하고 있다는 것만 의미합니다. 이 경우와 같이 해당 메소드에 매개 변수 목록이없는 경우 스칼라 에서는 parens를 생략 해야 합니다.
진행중인 "마법"을 "암시 적 변환"이라고합니다. 암시 적 변환을 가져오고 있으며 일부는 Int (및 Double)에서 Duration으로의 변환을 처리합니다. 그것이 당신이 다루고있는 것입니다.
import scala.concurrent.duration._
해결 20 seconds
되지만 실제로 DurationConversions
속성을 가져 오는 이유 는 무엇입니까? 편집 : 그들이 실제로 가져오고있는 것을 깨달았습니다 DurationInt
. 실제 특성을 가져올 수 없기 때문입니다. Trait의 구체적인 구현 만?