저는 왜 Graphics 인스턴스를 Graphics2D 인스턴스로 다운 캐스팅 할 수 있는지 알아 내려고하고 있습니다.그래픽 인스턴스 다운 캐스트 - 왜 허용됩니까?
대상 유형을 상속하지 않는 참조 유형 을 다운 캐스팅하는 것은 일반적으로 반대되는 규칙입니다. 그래픽 중심의 수업에서
계층 구조는 같다 다음
- 그래픽 슈퍼
- 의 Graphics2D입니다 슈퍼 그래픽의 서브 클래스는
스윙에 뭔가를 그리기 당신 paint() 메소드를 오버라이드합니다. 2D 드로잉이 필요한 경우 paint() 메서드에서 자동으로 제공된 Graphics 인스턴스를 Graphics2D 인스턴스로 다운 캐스팅합니다.
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
}
하지만 역순입니까? Graphics 인스턴스가 이 아니고이 graphics2D 인스턴스를 상속합니다. 이 클래스 계층을 볼 때 Graphics 인스턴스를 상속 한 것은 Graphics2D 인스턴스입니다!
왜 허용됩니까?
'Graphics' 인스턴스가'Graphics2D'가 아닌 경우 이것은 단지 예외를 던집니다. –
일반적으로 프로그래머가 형식 시스템을 우회해야하기 때문에 일반적으로 다운 캐스팅이 허용됩니다. 이는 유형 시스템의 결함이나 API 디자인의 결함 때문일 수 있습니다. '페인트 '의 경우 스윙 API의 결함이라고하지만 그 점은 제 의견입니다. –