복붙노트

[SCALA] 스칼라 단일 메소드 인터페이스 구현

SCALA

스칼라 단일 메소드 인터페이스 구현

합니까 스칼라는 다음 코드를 대체 할 수있는 문법 설탕 있습니다 :

val thread = new Thread(new Runnable {
   def run() {
     println("hello world")
   }    
})

뭔가 더 같은 :

val thread = new Thread(() => println("hello world"))

경우에 특성 / 인터페이스 요구 하나 개의 방법이 구현 될 때? 그렇지 않으면, 미래에 스칼라에서이 기능을 가질 수있는 기회가있다? 하나는 자바 클래스와 거래 할 때 특히 유용합니다.

일반적으로는 스칼라 폐쇄와 자바 단일 추상 메소드 인터페이스를 구현 : 나는 비슷한 질문이 3 년 전에 물었다 발견? 그 대답은 우리가 스칼라 2.10 기능을해야했다. 나는 싱글 추상 방법 키워드를 검토 한하지만 난 아무것도 발견하지 않았습니다. 무엇이 기능 일어난?

해결법

  1. ==============================

    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. ==============================

    2.일반적인 방법으로이 일을하는 것은 확실히 복잡하지만 당신은 당신이 정말로 단지 몇 특정 자바 유형이 필요하다는 것을 알게되면, 다음 몇 가지 간단한 암시 적 변환 멋지게 일을 할 수 있습니다. 예를 들어 :

    일반적인 방법으로이 일을하는 것은 확실히 복잡하지만 당신은 당신이 정말로 단지 몇 특정 자바 유형이 필요하다는 것을 알게되면, 다음 몇 가지 간단한 암시 적 변환 멋지게 일을 할 수 있습니다. 예를 들어 :

    val thread = new Thread(() => println("hello world"))
    thread.start
    
    implicit def function0ToRunnable(f:() => Unit):Runnable = 
      new Runnable{def run() = f()}
    

    때때로 일반적인 완전히 다시 가능한 방법으로 문제를 해결하기 위해 노력하는 것은 실제 문제가 더 후 묶여있다 생각하면 잘못된 접근이다.

  3. ==============================

    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")
    }
    
  4. from https://stackoverflow.com/questions/22820352/scala-single-method-interface-implementation by cc-by-sa and MIT license