[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.나는 간접적으로 포함이 생각 :
나는 간접적으로 포함이 생각 :
바와 같이 여기 : http://programming-scala.labs.oreilly.com/ch06.html
한마디로 당신의 개체 동반자 개체 (동반자 클래스가) 예상처럼 당신이 그것을 호출 할 수 없습니다 때문입니다. 당신이 클래스를 제거하는 경우가 발견으로 작동합니다.
-
==============================
2.그것은 자신의 클래스에서 직접 싱글에 액세스하는 것이 좋습니다.
그것은 자신의 클래스에서 직접 싱글에 액세스하는 것이 좋습니다.
이 경우 :
org.fun.ScalaPower$.MODULE$.showMyPower(10);
구현 세부 사항에 너무 많은 것없이, 스칼라는 객체와 클래스 / 형질 사이 네임 스페이스를 구별합니다. 이것은 그들이 같은 이름을 사용할 수 있다는 것을 의미합니다. 그러나, 객체는 클래스가, 따라서 JVM에 변환 된 이름이 필요합니다. 현재 스칼라 규칙 (최상위 모듈) 모듈 이름의 끝에 $를 추가하는 것입니다. 객체가 클래스에 정의되어있는 경우, 나는이 협약이 OuterClass $ MODULENAME $입니다 생각합니다. ScalaPower 모듈의 단일 속성을 적용하려면, 또한 모듈 이름 $ 클래스의 정적 모듈 $ 구성원이 있습니다. 이것은 하나 개의 인스턴스 만이 있음을 보장 클래스로드시에 초기화됩니다. 이것의 부작용은 모듈의 생성자에서 잠금 모든 종류의를하지 말아야한다는 것입니다.
어떤 경우에는, 스칼라는 그것으로 정전기 전달자의 메커니즘 "일이 자바에 대한 더 좋은 메이크업"을 구축했다. 그냥 ScalaPower $ .MODULE $ .someMethod ()를 호출하는 ScalaPower 클래스의 정적 메소드를 기록하는 곳이다. 당신은 또한 동반자 클래스를 정의하는 경우가 JVM에 정적 및 인스턴스 수준의 방법과 이름 충돌을 할 수 없습니다로 생성 될 수있는 전달자가 제한됩니다. 컴패니언 객체가 있다면 나는 당신이 정적 전달자를 잃고, 2.8.0이 수단으로 생각한다.
이 경우는 "가장 좋은 방법은"전달자가 ScalaPower 클래스에 수정을 사라질 수 있기 때문에 항상 정적 전달자 대신 ScalaPower $ .MODULE $ 참조를 사용하는 것입니다.
에데 : 눌러
-
==============================
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.주식은 javap 도구 스칼라 컴파일러가 생성하는 것을 볼 수 있습니다 있음을 유의하십시오. 그것은 직접 물론, 귀하의 질문에 대답하지 않습니다,하지만 당신이 필요로하는 것은 단지 코드 생성 패턴을 상기 할 때, 충분한입니다.
주식은 javap 도구 스칼라 컴파일러가 생성하는 것을 볼 수 있습니다 있음을 유의하십시오. 그것은 직접 물론, 귀하의 질문에 대답하지 않습니다,하지만 당신이 필요로하는 것은 단지 코드 생성 패턴을 상기 할 때, 충분한입니다.
-
==============================
5.일 후
일 후
class ScalaPower object ScalaPower{ def showMyPower(time:Int) = { (0 to time-1).mkString(", ") } }
ScalaPower.showMyPower (10)로 예상 작동합니다.
from https://stackoverflow.com/questions/3282653/how-do-you-call-a-scala-singleton-method-from-java by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 어떻게 스칼라 2.10에서 구현 게으른 발 클래스 변수는? (0) | 2019.11.22 |
---|---|
[SCALA] 스칼라지도 # get 및 일부의 반환 () (0) | 2019.11.22 |
[SCALA] 스칼라의 문자열로 문자열을 분할하는 방법 (0) | 2019.11.22 |
[SCALA] DList은 무엇인가? (0) | 2019.11.22 |
[SCALA] 스칼라가 예기치 않게 확장 기능에 대한 확인 유형 수없는 (0) | 2019.11.22 |