2017-10-06 1 views
2

두 세트가 있는데 그 중 하나는 파생 클래스의 인스턴스를 나열합니다. 생성 된 세트 유형이 제 제어 범위를 벗어났습니다. 두 세트가 모두 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]] 

답변

0

, 그것은 결과 값의 유형 Set[A]을 assignes. Set(new B("2"), new B("3"))으로 세트를 생성하면 Set[B] 유형이 결과 값에 지정됩니다.

따라서 결과 집합은 다른 유형이므로 교차 할 수 없습니다. 그러나 다음과 같이 변수를 초기화하는 경우 :

val set12: Set[A] = Set(new A("1"), new A("2")) 
val set23: Set[A] = Set(new B("2"), new B("3")) 

그런 다음 유형을 직접 지정합니다. 결과 값의 유형이 같으므로 다른 작업을 교차하고 수행 할 수 있습니다.

예를 들어, 다음과 같이 intersect를 사용할 수 있습니다

위의 예에서
val as: Set[A] = set12 intersect set23 // gives empty set as intersection 

, 결과 교차 세트가 비어가 동일한 개체를 가지고 있지 않기 때문에.

비교를 성공적으로 수행하려면 equals 클래스 메소드도 무시해야합니다. 귀하의 경우에는 A 만 덮어 쓰기 만하면됩니다. (사례 클래스를 확장하는 것은 권장되지 않기 때문에) 다음은 권장되지하지만 작업 방법 :

case class A(name: String) { 
    override def equals(obj: scala.Any): Boolean = obj match { 
    case A(x) => x.equals(name) 
    case _ => false 
    } 
} 

class B(name: String) extends A(name) 

val set12: Set[A] = Set(new A("1"), new A("2")) 
val set23: Set[A] = Set(new B("2"), new B("3")) 

val as: Set[A] = set12 intersect set23 // gives A(2) as intersection 
println(s"as = ${as}") 
+0

"하지만 당신은 다음과 같이 변수를 초기화하는 경우 :"나는 이것이 내가 할 수없는 뭔가가 내 질문에 작성했습니다. B 유형이 필요한 다른 환경에서 set23이 필요합니다. – Suma

+0

"결과 교차 세트가 비어 있습니다."맞습니다. 코드를 지나치게 단순화했습니다. A를 사례 클래스로 변경했습니다. 사례 클래스에서 파생된다는 것은 나쁜 습관이라는 것을 알고 있습니다. 그러나이 질문의 목적 상, 이것은 등호가 재정의되었는지를 확인하는 가장 짧은 방법입니다. – Suma

+0

'case class' 예제는 질문의 목적에 불과하며이 목적을 위해 작동합니다. 미안합니다. 그러나 equals를 적절하게 재정의하는 방법을 확장하여 목표를 달성하는 데 더 가깝지 않습니다. 답변의 핵심 부분은 여러 유형이 될 필요가있는 두 세트를 교차시키는 방법에 대한 질문을 여전히 피하는 것입니다. – Suma

관련 문제