어디에서 선을 그리려고 하는가의 문제입니다. 암시 적 다운 캐스트의 유효성을 감지하는 언어를 설계 할 수 있습니다.
public static void main(String args[]) {
// An implicit upcast
Fruit parent = new Apple();
// An implicit downcast to Apple
Apple child = parent;
}
이제 메소드를 추출해 봅시다 :
public static void main(String args[]) {
// An implicit upcast
Fruit parent = new Apple();
eat(parent);
}
public static void eat(Fruit parent) {
// An implicit downcast to Apple
Apple child = parent;
}
우리는 여전히 좋다. 정적 분석은 훨씬 어렵지만 여전히 가능합니다.
그러나 누군가가 추가하는 두 번째 문제는 다음과 같습니다.
public static void causeTrouble() {
// An implicit upcast
Fruit trouble = new Orange();
eat(trouble);
}
이제 어디에서 오류를 발생 시키겠습니까? 이로 인해 딜레마 Apple child = parent;
가 생겨서 문제가 있다고 말할 수 있지만 "하지만 이전에는 효과가있었습니다"라는 반박이있을 수 있습니다. 다른 한편으로, 추가 eat(trouble);
는 문제를 일으켰다 ", 그러나 다형성의 요점은 정확히 그것을 허용하는 것입니다.
이 경우 프로그래머의 일부 작업을 수행 할 수 있지만 모든 작업을 수행 할 수는 없습니다. 포기하기 전에 더 많이 가져 갈수록 무엇이 잘못되었는지 설명하기가 더 어려워집니다. 따라서 오류를 조기에보고하는 원칙에 따라 가능한 빨리 중지하는 것이 좋습니다.
BTW, Java에서 설명 한 다운 캐스트는 실제로 다운 캐스트가 아닙니다. 이것은 일반적인 캐스트이며 사과를 오렌지에도 캐스트 할 수 있습니다. 기술적으로 @chi의 아이디어는 이미 여기에 있습니다. Java에는 다운 캐스트가 없으며 "모든 캐스트"만 있습니다. 결과 유형이 인수 유형에서 다운 스트림으로 찾을 수없는 경우 컴파일 오류를 발생시키는 특수 다운 캐스트 연산자를 설계하는 것이 합리적입니다. 프로그래머가 별다른 이유없이 사용하지 못하도록 "모든 캐스트"를 사용하기 훨씬 더 어렵게 만드는 것이 좋습니다. C ++의 XXXXX_cast<type>(argument)
구문이 떠 오릅니다.