답변
그럼 정말로 할 수 없습니다. Java는 두 배의 발송을 할 수 없습니다. 문제는 메서드 호출의 바인딩이 대개 컴파일 시간에 수행된다는 것입니다.
http://en.wikipedia.org/wiki/Double_dispatch여기
여기
http://www.javaperformancetuning.com/articles/ddispatch2.shtml
해당하지 않습니다. MyImpl의 doSomething (Object obj)은 MyTemplate의 doSomething을 재정의하는 메서드입니다.
MyImpl에서 doSomething (Object obj)의 instanceof-operator를 사용하십시오. 그것은 어쨌든 더 나은 스타일입니다.
일반적으로 instanceof의 사용은 Liskov Substitution Principle (LSP)의 가능한 위반을 암시한다고 생각합니다. –
이 경우 하위 클래스는 특수 유형의 객체에 대해 "최적화 된"것처럼 보이지만 모두 처리 할 수 있습니다. 우리는 약간의 구별이 필요하며 이것은 instanceof에 의해 수행됩니다. 또한 뭔가를 서브 클래 싱하고 원본 객체 대신 IMHO를 사용하면 프로그램을 변경하는 좋은 방법이기 때문에이 원리가 마음에 들지 않습니다. 어쩌면 나는 그 원리를 이해하지 못했을 것입니다. – Daniel
이러한 유형의 사안에서는 다형성이 instanceof보다 선호됩니다.또한 메소드 내의 특정 부속 유형을 점검하고있는 경우, 메소드는 해당 부속 유형을 매개 변수로 허용하고 수퍼 유형은 승인하지 않아야합니다 (OP가 제공하는 예제에서 일반 사항으로 수행 할 수 있음). – whaley
즉, 당신은 할 수 없습니다. 다른 해답이 이유를 설명했습니다. 대신 제네릭을 사용하고 String (또는 다른 특정 클래스)을 처리하기 위해 추상 클래스의 특정 하위 유형에 의존 할 수 있습니다. 예를 들어 :
abstract public class MyTemplate<T> {
abstract public void doSomething(T t);
}
public class MyTemplateImpl extends MyTemplate<Object> {
@Override
public void doSomething(Object o) {
System.out.println("Dealing with a generic Object");
}
}
public class MyTemplateImplForStrings extends MyTemplate<String> {
@Override
public void doSomething(String s) {
System.out.println("dealing with a String");
}
}
는 호출 코드는 다음과 같을 것이다 의미합니다 :
MyTemplateImplForStrings template = new MyTemplateImplForStrings();
template.doSomething("hello"); //prints ""dealing with a String"
또는
MyTemplate<String> template = new MyTemplateImplForStrings();
template.doSomething("hello"); //prints ""dealing with a String"
참고 : 당신은 당신의 참조로 추상 기본을 사용하지 않도록 할 것 String으로도 매개 변수화하지 않는 한 그렇지 않으면 런타임시 ClassCastExceptions 문을 열어두고 컴파일러에서 경고해야합니다.
Java 컴파일러는 메서드 인수의 컴파일 타임 형식을 사용하여 메서드 호출을 만듭니다.이 예제에서는 Object가 아닌 String입니다. 인수의 런타임 유형은 메소드 호출에 의해 무시됩니다.
입력 클래스를 모두 제어하거나 reflection을 사용하면 느려지거나 복잡해지며 잘못 입력하기 쉽습니다.
- 1. 자바 : 내가하는 방법이 방법
- 2. 추상 클래스를 사용하는 자바
- 3. 추상 템플릿 기본 클래스에 대한 포인터입니까?
- 4. LINQ 내가 그 방법이 방법
- 5. 추상 클래스와 템플릿, 재난을위한 레시피를 혼합하고 있습니까?
- 6. 동적으로 자바 바인딩 템플릿
- 7. 자바 스크립트 템플릿 엔진?
- 8. 다른 추상 클래스에서 상속받은 추상 클래스를 가질 수 있습니까? (자바)
- 9. 추상 메서드가없는 추상 클래스
- 10. 추상 또는 가상 방법?
- 11. 방법이 내가 이런 식으로 뭔가를 선언
- 12. 안전한 자바 스크립트 템플릿
- 13. 자바 템플릿 디자인
- 14. 자바 스크립트 템플릿 이미지
- 15. JSP + 자바 스크립트 : 템플릿
- 16. 자바 스크립트 템플릿 엔진
- 17. 레일즈와 자바 스크립트로 템플릿 공유하기
- 18. 자바 클래스가 리플렉션에 의해 추상 클래스인지 여부를 결정하는 방법
- 19. 자바 스크립트에서 추상 메소드의 목적은 무엇입니까?
- 20. 템플릿, 다형성, 추상 기본 클래스 포인터 및 런타임 캐스팅
- 21. 추상 메서드가 추상 메서드를 재정의합니다.
- 22. jvm이 추상 클래스에서 클래스 객체를 즉석에서 만들려면 비용이 많이 듭니까? 내가 템플릿 디자인 패턴을 사용하려고
- 23. 자바 내가 같은 클래스에서 두 가지 방법이 오류
- 24. 자바 - 추상 클래스와 서브 클래스의 이진 호환성
- 25. 자바 제네릭 확장 제네릭 및 추상 클래스
- 26. 무슨 자바 추상 클래스와 인터페이스의 필요성
- 27. 자바 스크립트 문자열에 면도칼 템플릿
- 28. 템플릿 클래스의 템플릿 선언 방법
- 29. 일반 추상 클래스를 가리키는 방법?
- 30. 추상 기반을 사용하여 템플릿 클래스의 개인 부분을 구현합니까?
OO 관점에서 볼 때, 나는 왜 그런 구조가 필요한지 열심히 생각할 것입니다. Object 클래스의 인스턴스에는 많은 동작이 없으므로 매개 변수로 전달해야하는 이유는 무엇입니까? –
Horst가 말한 것과 마찬가지입니다. 메소드 서명에서 "Object"유형으로 작업하도록 기본 클래스를 정의하려는 경우 실제로 특정 유형을 처리한다고 가정하면 안됩니다. 제네릭 대신 MyTemplate의 클래스 계층 구조를 정의하는 것이 좋습니다. – whaley