복붙노트

[SCALA] java.lang.String의 대 스칼라 문자열 - 형식 유추

SCALA

java.lang.String의 대 스칼라 문자열 - 형식 유추

REPL에서 나는 함수를 정의합니다. 반환 형식을합니다.

scala> def next(i: List[String]) =  i.map {"0" + _} ::: i.reverse.map {"1" + _}
next: (i: List[String])List[java.lang.String]

그리고 문자열로 반환 유형을 지정하는 경우

scala> def next(i: List[String]): List[String] = i.map {"0" + _} ::: i.reverse.map {"1" + _}
next: (i: List[String])List[String]

왜 차이점은 무엇입니까? 내가 문자열 java.lang.String의 단지 래퍼 슈퍼 추측 그래서 나는 또한, [모든] 목록으로 반환 유형을 지정할 수 있습니다. 이것은 어떤 실제적인 영향을 미칠 것인가 아니면 안전하게 반환 유형을 지정할 수 없습니다?

해결법

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

    1.이것은 아주 좋은 질문입니다! 첫째, 내가 안전하게 반환 유형을 지정할 수 있습니다 당신을 확신 할 수 있습니다.

    이것은 아주 좋은 질문입니다! 첫째, 내가 안전하게 반환 유형을 지정할 수 있습니다 당신을 확신 할 수 있습니다.

    추론 왼쪽 때 ... 예, 스칼라 대신 문자열로, java.lang.String의 추론에 지금의 모습을 보자. 당신이 ScalaDoc에서 "문자열"을 보면 그래서, 당신은 하나 스칼라 클래스없는 것처럼 보입니다 아무것도를 찾을 수 없습니다. 음,하지만, 어딘가에서 온있다.

    의는 기본적으로 어떤 스칼라 수입을 생각해 보자. 당신은 REPL에 스스로 찾을 수 있습니다 :

    scala> :imports
     1) import java.lang._             (155 types, 160 terms)
     2) import scala._                 (801 types, 809 terms)
     3) import scala.Predef._          (16 types, 167 terms, 96 are implicit)
    

    실제로, 문자열이있는 java.lang에서 찾을 수 있습니다, 그리고 - 처음 두 패키지입니다! 다음, 그것이인가? 해당 패키지에서 다른 뭔가를 인스턴스화하여하자 검사 :

    scala> val s: StringBuffer = new StringBuffer
    s: java.lang.StringBuffer =
    
    scala> val s: String = new String
    s: String = ""
    

    그래서, 그게 될 것 같지 않습니다. 지금, 그것은 스칼라 패키지 내부에 수 없습니다, 또는 ScalaDoc에 찾는 경우가 발견되었을 것입니다. 그래서하자 scala.Predef 내부 모습, 그리고 거기입니다!

    type String = String
    

    즉, 문자열 (이전에 가져온) java.lang.String의 별칭이다. 즉, 순환 참조처럼 보이지만, 그러나 당신이 소스를 선택하면, 당신은이 전체 경로로 정의 볼 수 있습니다 :

    type String        = java.lang.String
    

    다음으로, 당신은 왜 질문 할 수 있습니다? 글쎄, 난 어떤 생각을 가지고 있지 않지만, 나는 그것이 JVM에 같은 중요한 클래스는 좀 덜 의존하게하는 것입니다 생각한다.

  2. from https://stackoverflow.com/questions/6559938/scala-string-vs-java-lang-string-type-inference by cc-by-sa and MIT license