2016-12-16 1 views
1

의 스칼라 REPL의 코드를 보자 : 먼저, 나는 특성을 정의 : 익명 함수가 특성을 어떻게 구현 했습니까?

trait Service{ 
    def invoke(name:String):String 
} 

는 내가 익명 함수를 정의 : 그것은 잘 작동

def serviceImpl:Service = (name)=> s"Your name is $name" 

.

serviceImpl 메서드는 익명 함수를 반환합니다. "(name)=> s"Your name is $name""은 Function2 [String, String] trait의 인스턴스입니다.

그러나 위와 같이 익명의 함수가 서비스 특성을 구현하는 방법은 무엇입니까?

어떻게 scala가 변환됩니까?

+0

반사 기반 오리 타이핑 + 자바 람다 계약의 조합으로 작동합니다. –

+0

힌트 : Scala 2.12.x를 사용하지 않으면이 기능이 제대로 작동하지 않습니다. – Suma

답변

5

이 새로운 기능은 2.12의 릴리스 노트에 설명되어 http://www.scala-lang.org/news/2.12.0#lambda-syntax-for-sam-types

스칼라 2.12 유형 검사는 FunctionN뿐만 아니라, 단일 추상 메소드 (SAM) 유형에 대한 유효한 식으로 함수 리터럴을 받아 표준 라이브러리의 유형. 이것은 Scala 코드에서 Java 8 용으로 작성된 라이브러리 사용 경험을 향상시킵니다.

scala> val f =() => println("Faster!") 
scala> val fasterRunnable: Runnable = f 
<console>:12: error: type mismatch; 
found :() => Unit 
required: Runnable 

언어 명세가 있습니다 만 람다 표현식 SAM 유형 인스턴스 FunctionN 유형의 임의하지 표현으로 변환

scala> val r: Runnable =() => println("Run!") 
r: Runnable = $$Lambda$1073/[email protected] 
scala> r.run() 
Run! 

주 : 여기에 java.lang.Runnable를 사용 REPL 예는 SAM 변환을위한 요구 사항의 전체 목록.

스칼라의 기본 FunctionN 특성은 기본 메서드를 사용하여 SAM 인터페이스로 컴파일됩니다. 이는 자바 자체 람다 구문을 사용하여 자바에서 스칼라 함수를 작성 허용 :

public class A { 
    scala.Function1<String, String> f = s -> s.trim(); 
} 

전문 기능 클래스는 SAM 인터페이스이며 패키지 scala.runtime.java8에서 찾을 수있다.

형식 검사가 개선되어 호출 된 메서드가 오버로드되는 경우에도 람다 식의 매개 변수 형식을 생략 할 수 있습니다. 자세한 내용은 # 5307을 참조하십시오. 다음 예에서, 컴파일러는 람다 매개 형 지능 추론 : 두 가지 방법이 적용 가능하지만보다 상세히 후술되는 바와 같이, 해상도가 과부하가 상기 기능 1 인수 유형 하나를 선택하는

scala> trait MyFun { def apply(x: Int): String } 
scala> object T { 
    | def m(f: Int => String) = 0 
    | def m(f: MyFun) = 1 
    | } 
scala> T.m(x => x.toString) 
res0: Int = 0 

참고.

관련 문제