[SCALA] 스칼라 단일 메소드 인터페이스 구현
SCALA스칼라 단일 메소드 인터페이스 구현
합니까 스칼라는 다음 코드를 대체 할 수있는 문법 설탕 있습니다 :
val thread = new Thread(new Runnable {
def run() {
println("hello world")
}
})
뭔가 더 같은 :
val thread = new Thread(() => println("hello world"))
경우에 특성 / 인터페이스 요구 하나 개의 방법이 구현 될 때? 그렇지 않으면, 미래에 스칼라에서이 기능을 가질 수있는 기회가있다? 하나는 자바 클래스와 거래 할 때 특히 유용합니다.
일반적으로는 스칼라 폐쇄와 자바 단일 추상 메소드 인터페이스를 구현 : 나는 비슷한 질문이 3 년 전에 물었다 발견? 그 대답은 우리가 스칼라 2.10 기능을해야했다. 나는 싱글 추상 방법 키워드를 검토 한하지만 난 아무것도 발견하지 않았습니다. 무엇이 기능 일어난?
해결법
-
==============================
1.스칼라는 플래그 -Xexperimental에서 2.11로 시작하는 SAM에 대한 실험적인 지원을하고있다 :
스칼라는 플래그 -Xexperimental에서 2.11로 시작하는 SAM에 대한 실험적인 지원을하고있다 :
Welcome to Scala version 2.11.0-RC3 (OpenJDK 64-Bit Server VM, Java 1.7.0_51). Type in expressions to have them evaluated. Type :help for more information. scala> :set -Xexperimental scala> val r: Runnable = () => println("hello world") r: Runnable = $anonfun$1@7861ff33 scala> new Thread(r).run hello world
편집 : 2.11.5 때문에,이 또한 인라인 수행 할 수 있습니다 :
scala> new Thread(() => println("hello world")).run hello world
예상 유형에 대한 일반적인 제한도 적용 :
원래에 따르면, 그 제한의 일부는 미래에 해제 할 수있다, 아드리안에 의해 특히 마지막 두 커밋합니다.
-
==============================
2.일반적인 방법으로이 일을하는 것은 확실히 복잡하지만 당신은 당신이 정말로 단지 몇 특정 자바 유형이 필요하다는 것을 알게되면, 다음 몇 가지 간단한 암시 적 변환 멋지게 일을 할 수 있습니다. 예를 들어 :
일반적인 방법으로이 일을하는 것은 확실히 복잡하지만 당신은 당신이 정말로 단지 몇 특정 자바 유형이 필요하다는 것을 알게되면, 다음 몇 가지 간단한 암시 적 변환 멋지게 일을 할 수 있습니다. 예를 들어 :
val thread = new Thread(() => println("hello world")) thread.start implicit def function0ToRunnable(f:() => Unit):Runnable = new Runnable{def run() = f()}
때때로 일반적인 완전히 다시 가능한 방법으로 문제를 해결하기 위해 노력하는 것은 실제 문제가 더 후 묶여있다 생각하면 잘못된 접근이다.
-
==============================
3.SAM 유형 스칼라 - 2.12 JDK-8과 유사은, 아래 2.12.3 테스트 이후 invokeDynamic를 사용하여 지원 - SAM에 대한 릴리스 정보는 여기에서 찾을 수 있습니다 - http://www.scala-lang.org/news/2.12.0 /
SAM 유형 스칼라 - 2.12 JDK-8과 유사은, 아래 2.12.3 테스트 이후 invokeDynamic를 사용하여 지원 - SAM에 대한 릴리스 정보는 여기에서 찾을 수 있습니다 - http://www.scala-lang.org/news/2.12.0 /
object ThreadApp extends App { println("Main thread - begins") val runnable: Runnable = () => println("hello world - from first thread") val thread = new Thread(runnable) println("Main thread - spins first thread") thread.start() val thread2 = new Thread(() => println("hello world - from second thread")) println("Main thread - spins second thread") thread2.start thread.join() thread2.join() println("Main thread - end") }
from https://stackoverflow.com/questions/22820352/scala-single-method-interface-implementation by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 CSV 파일에서 스키마를 만들고 파일에 해당 스키마 저장 / 유지하기 위해? (0) | 2019.11.18 |
---|---|
[SCALA] 스파크 열 문자열 다른 열 (행)에 존재하는 경우 대체 (0) | 2019.11.18 |
[SCALA] 매개 변수 값 스칼라 - 스파크 동적으로 호출 GROUPBY 및 AGG (0) | 2019.11.17 |
[SCALA] Scalaz 귀속 [서열] typeclass (0) | 2019.11.17 |
[SCALA] 스칼라에서 자바 람다를 사용하는 방법 (0) | 2019.11.17 |