2014-04-19 2 views
1

안녕하세요, 다형성에 문제가 있습니다.자바에서 다형성의 작은 오해가

일반적으로 나는 그것이 무엇을 의미하는지 이해했다고 생각합니다. 아래에 MWE를 추가했습니다.

나는 콘솔에 Using String 텍스트의 두 배를 얻을 것으로 예상했다. 사실 나는 두 가지 텍스트를 모두 얻습니다. 왜?

이유는 방문자 패턴과 같은 패턴을 만들고 싶습니다. if(... instanceof ...)의 체인을 피하고 싶습니다. 따라서 각 메서드에 대해 오버로드 된 메서드 (여기 StringObject)를 구현한다고 생각했습니다.

질문은 이제 java를 올바른 방법으로 선택하는 방법입니다.

추신 : 제가이 문제가있는 이유는 기본 유형을 다른 용도로 사용하기 위해 클래스에 '상자'해야한다는 것입니다. 따라서 Integer, Boolean을 테스트해야합니다.이 또한 클래스를 확장하고 일반적인 방법을 사용할 수없는 이유이기도합니다.

public class TestOverload 
{ 
    public static void main(String[] args) 
    { 
     String s = "abc"; 
     Object o = s; 

     TestOverload test = new TestOverload(); 
     test.doSomething(s); 
     test.doSomething(o); 
    } 

    public void doSomething(Object o) 
    { 
     System.out.println("Using Object"); 
    } 

    public void doSomething(String s) 
    { 
     System.out.println("Using String"); 
    } 
} 
+0

Java는 메소드 인수에 대해 후기/정적 바인딩을 사용합니다 (어쩌면 [this] (http://stackoverflow.com/questions/3883414/is-there-any-reason-that-java-uses-late-static-binding- for-overloaded-methods-in? rq = 1) 질문이 유용합니다. 적절한 메소드를 선택하기 위해서는'instanceof'를 묶어야 할 것 같은데요. – MBlanc

답변

1

Java 가상 머신에서 메소드는 이름, 인수 유형 및 반환 유형으로 결정됩니다. 이것이 "성명"이 다르기 때문에 동일한 이름을 가진 두 개 이상의 메소드가 공존 할 수있는 이유입니다. Java 컴파일러는 호출 할 가장 적합한 메소드를 선택하므로 최소한의 인수 유형 변환이 필요합니다 (반환 유형은 무시됩니다). 따라서 첫 번째 경우에는 doSomething(String s)을 선택하고 두 번째 경우에는 doSomething(Object o)을 선택합니다. 런타임에는 컴파일 타임에 선택된 메서드가 호출되므로 실제 유형은 Object o입니다.

단순 유형을 정수와 부울로 묶는 경우 instanceof을 제외한 실제 유형을 판별하는 다른 f}은 없습니다. 확장 될 수있는 자신의 유형에 복싱을 고려하십시오.

관련 문제