스칼라에서 변수를 어떻게 캐스트합니까?


199

type 변수가 주어지면 Scala에서 Graphics어떻게 캐스트 Graphics2D합니까?

답변:


282

선호하는 기술은 패턴 일치를 사용하는 것입니다. 이를 통해 해당 값 이 지정된 유형 이 아닌 경우를 정상적으로 처리 할 수 ​​있습니다 .

g match {
  case g2: Graphics2D => g2
  case _ => throw new ClassCastException
}

이 블록은 asInstanceOf[Graphics2D]방법 의 의미론을 복제 하지만 유연성이 뛰어납니다. 예를 들어 여러 유형에 대해 서로 다른 분기를 제공하여 동시에 여러 조건부 캐스트를 효과적으로 수행 할 수 있습니다. 마지막으로, 당신은하지 않습니다 정말 , 당신은 또한 반환 할 수 캐치 - 모든 지역에서 예외를 throw 할 필요가 null(또는 바람직 None), 또는 당신은없이 작동 일부 대체 분기를 입력 할 수 있습니다 Graphics2D.

요컨대, 이것은 실제로 갈 길입니다. 보다 문법적으로 약간 부피가 크지 asInstanceOf만 추가 된 유연성은 거의 항상 가치가 있습니다.


19
흥미 롭기 때문에 +1이지만이 시나리오에서는 너무 많습니다. 그렇지 않습니까?
유진 요코타

<code> base match {case MyConcrete (value) => base.asInstanceOf [MyConcrete] .something (value)} </ code> : 이미 패턴 일치하지만 캐스트 된 값에 대한 참조가 손실 된 경우 ' "case MyConcrete (value)"에 의해 수행 된 '적용되지 않음'호출을 이용하여 "값"을 추출하려는 경우에도 base '를 MyConcrete로 캐스트합니까?
ithkuil

4
이것을 시도하십시오 : base match { case base @ MyConcrete(value) => base.something(value) } 분명히, 그림자 base는 선택 사항입니다. 다른 변수 이름을 쉽게 사용할 수 있습니다.
Daniel Spiewak

내가 얻지 못하는 것은이 패턴 일치 결과를 변수에 캐스트하는 방법은 무엇입니까? String 인 경우 java에서와 같이 a = (String) b; 스칼라와 동등한 것은 무엇입니까?
James McMahon

@JamesMcMahonval gResult = g match { case g2: Graphics2D => g2 case _ => throw new ClassCastException }
케빈 메러디스

224
g.asInstanceOf[Graphics2D];

36
스칼라에 익숙해지면 asInstanceOf정적 유형 시스템 을 사용 하는 목적을 상실하고 유쾌한 느낌이 들기 때문에 사용하지 않는 법을 배웠습니다 .
유진 요코타

26
불행히도, 이것은 Swing을 사용할 때 일반적인 작업입니다. 사용자 정의 페인팅 작업의 경우 'public void paintComponent (Graphics g)'메서드를 재정의해야합니다. Graphics 매개 변수는 실제로는 Graphics2D 인스턴스이지만 캐스트가 필요합니다. 패턴 일치 버전은 아마도 보증보다 더 자세한 정보 일 것입니다. 기억하십시오 : 난독 한 과장과 과식을 현명하게 피하십시오!
hohonuuli

7
@hohonuuli 특정 경우에는 캐스트가 괜찮다고 생각하지만 scala-swing컴포넌트 를 사용하는 경우 paintComponent의 매개 변수는 이미 Graphics2D이므로 캐스트가 필요하지 않습니다.
Luigi Plinge

2
왜 그렇게 오래? ? 왜 키워드 또는 방법 또는 이유는 기존과 그와 더 큰 문제가 없기 때문에 그들은 단지 옵션으로 C ++ 및 Java 방법을 채택하지 않았다 "asof로"asInstanceOf는 경우에만 할 수있다 ""또는 "
레 뮤엘 ADANE

16
@LemuelAdane 캐스트를 전혀 사용하지 않는다는 사실은 코드 냄새이기 때문에 쉽게 만들 수 없습니다.
데니스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.