복붙노트

[SCALA] 어떻게 자바에서 방법 싱글 스칼라 부릅니까?

SCALA

어떻게 자바에서 방법 싱글 스칼라 부릅니까?

내 기존 Java 응용 프로그램에 일부 스칼라 코드를 삽입하기 위해 노력하고있어. (그래서 존재는 좀 더 많은 재미를 원했다).

나는 스칼라에서 싱글 물건을 만들

ScalaPower.scala

    package org.fun
    class ScalaPower
    object ScalaPower{
      def showMyPower(time:Int) = {
        (0 to time-1).mkString(", ")
      }
    }

이제, OldJava.java 내부

class OldJava {
  public void demo(){
    System.out.println(?)
  }
}

나는 무엇을 기입해야합니까? 그래서 자바는 showMyPower 메서드를 호출하는 것? 난 둘 다 org.fun.ScalaPower.showMyPower (10)와 org.fun.ScalaPower.getInstance (). showMyPower (10) 있지만 없음 작업을 시도했다.

(애플 리케이션 설계를 사용하여 클래스 파일을 디 컴파일 나에게 아무것도하지만 말도 안되는 코드가 표시되지 않습니다.)

편집하다 나는 클래스 ScalaPower 선언을 제거하고 예상대로 정적 메서드를 생산 스칼라. (org.fun.ScalaPower.showMyPower (10 호) 만 작동).

원더는 스칼라 컴파일러 여부에 버그가 있다면

해결법

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

    1.나는 간접적으로 포함이 생각 :

    나는 간접적으로 포함이 생각 :

    바와 같이 여기 : http://programming-scala.labs.oreilly.com/ch06.html

    한마디로 당신의 개체 동반자 개체 (동반자 클래스가) 예상처럼 당신이 그것을 호출 할 수 없습니다 때문입니다. 당신이 클래스를 제거하는 경우가 발견으로 작동합니다.

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

    2.그것은 자신의 클래스에서 직접 싱글에 액세스하는 것이 좋습니다.

    그것은 자신의 클래스에서 직접 싱글에 액세스하는 것이 좋습니다.

    이 경우 :

    org.fun.ScalaPower$.MODULE$.showMyPower(10);
    

    구현 세부 사항에 너무 많은 것없이, 스칼라는 객체와 클래스 / 형질 사이 네임 스페이스를 구별합니다. 이것은 그들이 같은 이름을 사용할 수 있다는 것을 의미합니다. 그러나, 객체는 클래스가, 따라서 JVM에 변환 된 이름이 필요합니다. 현재 스칼라 규칙 (최상위 모듈) 모듈 이름의 끝에 $를 추가하는 것입니다. 객체가 클래스에 정의되어있는 경우, 나는이 협약이 OuterClass $ MODULENAME $입니다 생각합니다. ScalaPower 모듈의 단일 속성을 적용하려면, 또한 모듈 이름 $ 클래스의 정적 모듈 $ 구성원이 있습니다. 이것은 하나 개의 인스턴스 만이 있음을 보장 클래스로드시에 초기화됩니다. 이것의 부작용은 모듈의 생성자에서 잠금 모든 종류의를하지 말아야한다는 것입니다.

    어떤 경우에는, 스칼라는 그것으로 정전기 전달자의 메커니즘 "일이 자바에 대한 더 좋은 메이크업"을 구축했다. 그냥 ScalaPower $ .MODULE $ .someMethod ()를 호출하는 ScalaPower 클래스의 정적 메소드를 기록하는 곳이다. 당신은 또한 동반자 클래스를 정의하는 경우가 JVM에 정적 및 인스턴스 수준의 방법과 이름 충돌을 할 수 없습니다로 생성 될 수있는 전달자가 제한됩니다. 컴패니언 객체가 있다면 나는 당신이 정적 전달자를 잃고, 2.8.0이 수단으로 생각한다.

    이 경우는 "가장 좋은 방법은"전달자가 ScalaPower 클래스에 수정을 사라질 수 있기 때문에 항상 정적 전달자 대신 ScalaPower $ .MODULE $ 참조를 사용하는 것입니다.

    에데 : 눌러

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

    3.당신이지고 있었다 오류는 무엇인가? 당신의 스칼라 예제 다음과 같은 자바 클래스를 사용 :

    당신이지고 있었다 오류는 무엇인가? 당신의 스칼라 예제 다음과 같은 자바 클래스를 사용 :

    고양이 test.java :

    
    import org.fun.*;
    
    public class test {
        public static void main(String args[]) {
           System.out.println("show my power: " + ScalaPower.showMyPower(3));       
        }
    }
    

    다음과 같이 그리고 실행 :

    자바 -cp :. <경로에 / 스칼라 / 설치-DIR> /lib/scala-library.jar 테스트

    내 출력을 제공합니다 :

    보여 내 전원 : 0, 1, 2

  4. ==============================

    4.주식은 javap 도구 스칼라 컴파일러가 생성하는 것을 볼 수 있습니다 있음을 유의하십시오. 그것은 직접 물론, 귀하의 질문에 대답하지 않습니다,하지만 당신이 필요로하는 것은 단지 코드 생성 패턴을 상기 할 때, 충분한입니다.

    주식은 javap 도구 스칼라 컴파일러가 생성하는 것을 볼 수 있습니다 있음을 유의하십시오. 그것은 직접 물론, 귀하의 질문에 대답하지 않습니다,하지만 당신이 필요로하는 것은 단지 코드 생성 패턴을 상기 할 때, 충분한입니다.

  5. ==============================

    5.일 후

    일 후

    class ScalaPower 
    object ScalaPower{
      def showMyPower(time:Int) = {
        (0 to time-1).mkString(", ")
      }
    }
    

    ScalaPower.showMyPower (10)로 예상 작동합니다.

  6. from https://stackoverflow.com/questions/3282653/how-do-you-call-a-scala-singleton-method-from-java by cc-by-sa and MIT license