복붙노트

[SCALA] 그것은 스칼라에서 자바 8 스타일의 방법 참조를 사용할 수 있습니까?

SCALA

그것은 스칼라에서 자바 8 스타일의 방법 참조를 사용할 수 있습니까?

나는 스칼라에 JavaFX8 응용 프로그램을 개발하고 있어요하지만 난 이벤트 핸들러 메소드 참조를 전달하는 방법을 알아낼 수 없었다. 나는 ScalaFX 라이브러리를 사용하지 않는 명확하지만, 자바 FX의 바로 위에 내 응용 프로그램을 빌드합니다.

다음은 관련 코드입니다.

InputController.java은 (난 단지 방법 참조를 소비하는 문제를 격리하기 위해 자바에서이 테스트 클래스를 썼다)

public class InputController {
    public void handleFileSelection(ActionEvent actionEvent){
        //event handling code
    }

    public InputController() {
        //init controller
    }
}

이 작품 (자바)

InputController inputController = new InputController();
fileButton.setOnAction(inputController::handleFileSelection);

이 작동하지 않습니다 (스칼라)

val inputController = new InputController
fileButton.setOnAction(inputController::handleFileSelection)

여기에 컴파일러 (스칼라 2.11.6)에서 오류 메시지입니다.

Error:(125, 45) missing arguments for method handleFileSelection in class Main;
follow this method with '_' if you want to treat it as a partially applied function
    fileButton.setOnAction(inputController::handleFileSelection)
                                            ^

내가 대신 스칼라 2.12.0-M2를 사용하는 경우, 내가 다른 오류 메시지가 표시됩니다.

Error:(125, 45) missing argument list for method handleFileSelection in class Main
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `handleFileSelection _` or `handleFileSelection(_)` instead of `handleFileSelection`.
    fileButton.setOnAction(inputController::handleFileSelection)
                                            ^

스칼라는 자바 8에 도입 된 방법 참조를 활용할 수있는 기본 방법이 있나요? 암시 적 변환이 람다 표현식을 사용하는 접근하지만 람다 decleration를 사용하지 않고 자바 8 유사한 방법 참조를 사용하는 방법이 있는지 알고 싶다의 나는 알고 있어요.

해결법

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

    1.inputController :: handleFileSelection는 이미이 같은 람다에 대한 짧은 구문을했기 때문에 스칼라에서 지원하거나 필요하지 않은 Java 구문입니다 : inputController.handleFileSelection _ 또는 inputController.handleFileSelection (_) (inputController.handleFileSelection는 작업에 따라 수 문맥).

    inputController :: handleFileSelection는 이미이 같은 람다에 대한 짧은 구문을했기 때문에 스칼라에서 지원하거나 필요하지 않은 Java 구문입니다 : inputController.handleFileSelection _ 또는 inputController.handleFileSelection (_) (inputController.handleFileSelection는 작업에 따라 수 문맥).

    그러나, 자바에서 당신은 어떤 SAM (하나의 추상 메소드) 인터페이스가 예상되는 람다 및 방법 참조를 사용할 수 있으며, 이벤트 핸들러는 같은 인터페이스입니다. 스칼라에서 버전 2.11 전에이 2.11, 전혀 허용되지 않습니다이 -Xexperimental scalac 플래그를 사용하여 활성화해야 SAM 인터페이스와 람다를 사용하고 2.12부터 시작을위한 실험적인 지원은 완전히 지원하고 필요하지 않습니다 가 활성화되어 있어야합니다.

  2. ==============================

    2.당신은 형의 ActionEvent의 하나 개의 매개 변수를 적용 기능을 전달해야합니다 :

    당신은 형의 ActionEvent의 하나 개의 매개 변수를 적용 기능을 전달해야합니다 :

    val button = new Button()
    val inputController = new InputController()
    
    def handler(h: (ActionEvent => Unit)): EventHandler[ActionEvent] =
      new EventHandler[ActionEvent] {
        override def handle(event: ActionEvent): Unit = h(event)
      }
    
    button.setOnAction(handler(inputController.handleFileSelection))
    
  3. from https://stackoverflow.com/questions/31927500/is-it-possible-to-use-a-java-8-style-method-references-in-scala by cc-by-sa and MIT license