답변:
선호하는 기술은 패턴 일치를 사용하는 것입니다. 이를 통해 해당 값 이 지정된 유형 이 아닌 경우를 정상적으로 처리 할 수 있습니다 .
g match {
case g2: Graphics2D => g2
case _ => throw new ClassCastException
}
이 블록은 asInstanceOf[Graphics2D]
방법 의 의미론을 복제 하지만 유연성이 뛰어납니다. 예를 들어 여러 유형에 대해 서로 다른 분기를 제공하여 동시에 여러 조건부 캐스트를 효과적으로 수행 할 수 있습니다. 마지막으로, 당신은하지 않습니다 정말 , 당신은 또한 반환 할 수 캐치 - 모든 지역에서 예외를 throw 할 필요가 null
(또는 바람직 None
), 또는 당신은없이 작동 일부 대체 분기를 입력 할 수 있습니다 Graphics2D
.
요컨대, 이것은 실제로 갈 길입니다. 보다 문법적으로 약간 부피가 크지 asInstanceOf
만 추가 된 유연성은 거의 항상 가치가 있습니다.
base match { case base @ MyConcrete(value) => base.something(value) }
분명히, 그림자 base
는 선택 사항입니다. 다른 변수 이름을 쉽게 사용할 수 있습니다.
val gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
g.asInstanceOf[Graphics2D];
asInstanceOf
정적 유형 시스템 을 사용 하는 목적을 상실하고 유쾌한 느낌이 들기 때문에 사용하지 않는 법을 배웠습니다 .
scala-swing
컴포넌트 를 사용하는 경우 paintComponent의 매개 변수는 이미 Graphics2D이므로 캐스트가 필요하지 않습니다.