2011-10-03 2 views
3

내 ENV는 다음과 같습니다유선 스칼라 형 디자인

스칼라 버전 2.9.1.final (자바 핫스팟 (TM) 64 비트 서버 VM, 자바 1.6.0_26).

시계 먼저 예 : 그래서

scala> var a = 1 
a: Int = 1 

scala> var c = 'c 
c: Symbol = 'c 

scala> var d = 1.1 
d: Double = 1.1 

scala> var b = "123" 
b: java.lang.String = 123 

scala> val e:String = "234" 
e: String = 234 

, 당신은 문자열을 제외하고 다른 문자를 볼 수 있습니다, 기본 유형은 스칼라 유형 (이다 Int Double Symbol

하지만 문자열 리터럴은 자바 타입 (java.lang.String.. 당신은 스칼라 형 String와 값을 정의 할 때

하고, 리터럴 문자열 유형 스칼라 문자열입니다.

,536,

문자열 리터럴의 기본 유형이 스칼라 문자열이 아닌 이유는 무엇입니까?

두 번째 :

자바에서 스칼라 메서드를 호출해야하는 경우.

과 같은 매개 변수와 스칼라 방법 : 자바 측

def hello(i:Int) = { 
    println(i) 
} 

. 너가 이렇게 부르면.

object.hello (NULL)

그것이 형식이 일치하여 실패 할 것이다.

java.lang.Integer은 null 일 수 있습니다. 그러나 scala Int은 null 일 수 없습니다.

scala의 null은 AnyRef의 부속 유형입니다. AnyVal 아닙니다.

나는 AnyRef와 AnyVal가 autobox가없는 java1.4 세계에 나를 데려 간 ㄴ다는 것을 것을을 발견했다. 첫 번째 질문에 대한

+1

질문을 좀 더 구체적으로 작성해주십시오. 질문을 명확히 해 주시겠습니까? –

+0

이 수정되었습니다. 이거 분명해? .. – Saito

+0

네, 그게 더 낫습니다, 고마워요. –

답변

8

답변 :

scala.String은 단순히 좋은 오래된 java.lang.String에 대한 Prelude Predef에 정의 된 유형의 동의어입니다. (scala.Int, java.lang.Integer 구별 종류 scala.Floatjava.lang.Float 등과 달리)

이 도움이 될 수 있습니다 : (유형을 관찰합니다.)

scala> def f(s: String) = s * 2 
f: (s: String)String 

scala> f("hello") 
res7: String = hellohello 

scala> def f(s: String): java.lang.String = s * 2 
f: (s: String)java.lang.String 

scala> f("hello") 
res8: java.lang.String = hellohello 

scala> type Str = String 
defined type alias Str 

scala> def f(s: String): Str = s * 2 
f: (s: String)Str 

scala> f("hello") 
res9: Str = hellohello 
+0

아마도'Prelude' 대신에'Predef'를 의미 할 것입니다 :-) –

+0

@ Jean-PhilippePellet : 나는 정정을 권고합니다. 감사! :-) – missingfaktor

6

missingfaktor은 당신이 가지고있는 첫번째 질문에 대답했다. 질문의 두 번째 부분에 대한

: Scala.Int는 java.lang.Integer의 다릅니다, 그것은 정말 자바 INT의 별칭이며, 거의 같은 동작이 : 그래서

scala> def print(i: Int) = println(i + " class=" + i.getClass.getName) 
print: (i: Int)Unit 
scala> print(43) 
43 class=int 

을 스칼라는 스칼라를 취급합니다. 가능한 한 int로 나타냅니다. autoboxing/unboxing은 정상적으로 발생합니다.

scala> print(new java.lang.Integer(666)) 
666 class=int 

실제로 실제로는 int를 예상하는 메서드에 null을 전달하는 것은 의미가 없습니다. 이것은 Java에서도 컴파일 오류입니다.

private void setInt(int i) {} 
setInt(null); // compilation error 

당신의 int이 예상되는 경우 전달 될 널 java.lang.Integer의 강제 경우에, 당신은 NullPointerException이 얻을. 이것은 Java와 완전히 동일한 동작입니다.

scala> val f: java.lang.Integer = null 
f: java.lang.Integer = null 
scala> print(f) 
java.lang.NullPointerException 
.... 

null 허용 개체를 사용하는 스칼라 메서드를 만들려면 java.lang.Integer를 사용하도록 선언하십시오. autoboxing/unboxing 동작은 Java의 경우와 완전히 동일합니다.

scala> def print(i: java.lang.Integer) = println(i + " class=" + i.getClass.getName) 
print: (i: java.lang.Integer)Unit 
scala> print(43) 
43 class=java.lang.Integer 
scala> print(new java.lang.Integer(666)) 
666 class=java.lang.Integer 
관련 문제