문제

편집하다: 원본 답변을 기반 으로이 질문을 다시 작성했습니다

그만큼 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
}
도움이 되었습니까?

해결책

Set 함수로서 세트 뒤에있는 개념 때문에 유형 매개 변수에서 변하지 않습니다. 다음 서명은 사물을 약간 명확히해야합니다.

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

만약에 Set 공분산이었다 A,, apply 메소드는 유형의 매개 변수를 가져갈 수 없습니다. A 함수의 분열로 인해. Set 잠재적으로있을 수 있습니다 비밀 안에 A, 그러나 이것은 다음과 같은 일을하고 싶을 때 문제를 일으 킵니다.

def elements: Iterable[A]

요컨대, 최상의 솔루션은 불변의 데이터 구조조차도 불변을 유지하는 것입니다. 당신은 그것을 알게 될 것입니다 immutable.Map 또한 유형 매개 변수 중 하나에서 변하지 않습니다.

다른 팁

~에 http://www.scala-lang.org/node/9764 Martin Odersky는 다음과 같이 씁니다.

"세트 문제에 대해서는 비 분위기가 구현에서 비롯된 것으로 생각합니다. 공통 세트는 핵심 유형의 비 변수 배열 인 해시 타이블로 구현됩니다. 나는 그것이 약간 성가신 불규칙성에 동의합니다."

따라서 이것에 대한 원칙적 이유를 구성하려는 우리의 모든 노력은 잘못 안내 된 것 같습니다 :-)

편집하다: 왜이 대답이 주제를 벗어난 것처럼 보이는지 궁금해하는 사람이라면, 이것은 질문자가 질문을 수정했기 때문입니다.

Scala의 타입 추론은 어떤 상황에서는 문자열이 아니라 숯을 원한다는 것을 알아 내기에 충분합니다. 특히, 다음은 2.7.3에서 나에게 효과가 있습니다.

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

불변을 만드는 방법에 관해서는 직접 해시를 직접 :하지 마십시오. 구현 최적화로서, 불변성. 그것들은 Empyset, set1, set2, set3 또는 set4입니다. 이 클래스는 서브 클래스를 불변 할 수 없지만 부정확하지는 않지만 불변.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top