두 세트가 있는데 그 중 하나는 파생 클래스의 인스턴스를 나열합니다. 생성 된 세트 유형이 제 제어 범위를 벗어났습니다. 두 세트가 모두 Set[A]
인지 확인하지 못합니다. set23
은 그 유형이 Set[B]
이어야하는 다른 상황에서 사용됩니다. 나는 교차하고 싶습니다 :클래스와 파생 클래스의 두 세트를 교차합니다.
case class A(name: String)
class B(name: String) extends A(name)
val set12 = Set(new A("1"), new A("2"))
val set23 = Set(new B("2"), new B("3"))
set12 intersect set23 // does not work
오류는 다음과 같습니다
형식이 일치; 발견 scala.collection.immutable.Set [B]
필요 : scala.collection.GenSet [A]
참고 < B : A,하지만 발전기 특성이 A. 형식의 불변
Set
은 공변 적이 지 않습니다. 세트를 다시 만들지 않고도 몇 가지 확실한 해결 방법이 있습니까? 작품에 따라,하지만 난 asInstanceOf
을 사용하지 선호 : 당신이 Set(new A("1"), new A("2"))
로 세트를 만들 때
set12 intersect set23.asInstanceOf[Set[A]]
"하지만 당신은 다음과 같이 변수를 초기화하는 경우 :"나는 이것이 내가 할 수없는 뭔가가 내 질문에 작성했습니다. B 유형이 필요한 다른 환경에서 set23이 필요합니다. – Suma
"결과 교차 세트가 비어 있습니다."맞습니다. 코드를 지나치게 단순화했습니다. A를 사례 클래스로 변경했습니다. 사례 클래스에서 파생된다는 것은 나쁜 습관이라는 것을 알고 있습니다. 그러나이 질문의 목적 상, 이것은 등호가 재정의되었는지를 확인하는 가장 짧은 방법입니다. – Suma
'case class' 예제는 질문의 목적에 불과하며이 목적을 위해 작동합니다. 미안합니다. 그러나 equals를 적절하게 재정의하는 방법을 확장하여 목표를 달성하는 데 더 가깝지 않습니다. 답변의 핵심 부분은 여러 유형이 될 필요가있는 두 세트를 교차시키는 방법에 대한 질문을 여전히 피하는 것입니다. – Suma