복붙노트

[SCALA] 왜 그 유형에 스칼라의 불변 인 Set 공변되지 않는 이유는 무엇입니까?

SCALA

왜 그 유형에 스칼라의 불변 인 Set 공변되지 않는 이유는 무엇입니까?

편집 : 원래의 답변에 따라이 문제를 다시 작성

scala.collection.immutable.Set 클래스의 형식 매개 변수의 공변되지 않습니다. 왜 이런거야?

import scala.collection.immutable._

def foo(s: Set[CharSequence]): Unit = {
    println(s)
}

def bar(): Unit = {
   val s: Set[String] = Set("Hello", "World");
   foo(s); //DOES NOT COMPILE, regardless of whether type is declared 
           //explicitly in the val s declaration
}

해결법

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

    1.설정 때문에 함수로 설정 뒤에 개념의 그것의 유형 매개 변수에서 일정입니다. 다음 서명은 일을 조금 명확히해야한다 :

    설정 때문에 함수로 설정 뒤에 개념의 그것의 유형 매개 변수에서 일정입니다. 다음 서명은 일을 조금 명확히해야한다 :

    trait Set[A] extends (A=>Boolean) {
      def apply(e: A): Boolean
    }
    

    세트가에 공변 된 경우, 적용 방법에 의한 기능의 contravariance에 A 형의 매개 변수를 사용 할 수 없을 것입니다. 설정은 잠재적으로 contravariant 수 있지만,이 같은 일을 할 때이 역시 문제가 발생 수 :

    def elements: Iterable[A]
    

    즉, 가장 좋은 방법은도 불변의 데이터 구조, 불변 일을 유지하는 것입니다. 당신은 immutable.Map는 형식 매개 변수 중 하나에 또한 불변임을 알 수 있습니다.

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

    2.http://www.scala-lang.org/node/9764에서 마틴 오더 스키 글 :

    http://www.scala-lang.org/node/9764에서 마틴 오더 스키 글 :

    그래서, 우리의 노력의 모든이를위한 원칙 이유는 잘못 :-)했다 구축 할 것으로 보인다

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

    3.편집 :이 대답은 약간 오프 토픽 보인다 사람이 왜 궁금 위해 I (질문자)이 질문을 수정 한 때문이입니다.

    편집 :이 대답은 약간 오프 토픽 보인다 사람이 왜 궁금 위해 I (질문자)이 질문을 수정 한 때문이입니다.

    스칼라의 타입 추론은 당신이 어떤 상황에서 CharSequences가 아닌 문자열을 원하는 것을 알아 내기에 충분하다. 2.7.3에서 나를 위해 특히, 다음 작품에서 :

    import scala.collections.immutable._
    def findCharSequences(): Set[CharSequence] = Set("Hello", "World")
    

    직접 immutable.HashSets를 작성하는 방법에 관해서는 :하지 않습니다. 구현 최적화로서, 이하의 5 개 요소의 immutable.HashSets 실제로 immutable.HashSet의 인스턴스 수 없습니다. 그들은 하나 EmptySet, Set1과, Set2를, SET3, 또는 SET4 있습니다. 이러한 클래스는 immutable.Set 하위 클래스,하지만 immutable.HashSet 없습니다.

  4. from https://stackoverflow.com/questions/676615/why-is-scalas-immutable-set-not-covariant-in-its-type by cc-by-sa and MIT license