2012-11-10 8 views
1

이 코드가 1.0이 아닌 2.0을 인쇄하는 이유는 무엇입니까?Java 매개 변수 서명 확인

abstract class B<T extends Number> { 
    abstract Number f(T j); 
} 

class A<T extends Number> extends B<T> { 
    public Number f(Float j) { 
     return 1f; 
    } 

    public Number f(T j) { 
     return j; 
    } 
} 

public class J { 
    public static void main(String[] args) { 
     B<Float> a = new A<>(); 
     Number r = a.f(2f); 
     System.out.println(r); 
    } 
} 

답변

2

핵심이다 여기서 문제의 변수 aB으로 선언했다는 것입니다. B 클래스에는 하나의 메소드 만 있기 때문에 그 중 하나가 승리합니다. 그러나 main에서 유형이 Aa 유형으로 변경하면 모호하기 때문에 컴파일되지 않습니다. 그러나 클래스 A의 메서드를 변경하여 기본 형식을 대신 사용하고 main() 메서드에서 변수 aA 유형으로 정의 된 경우 이됩니다. 즉, 다음 1.0 인쇄가 발생합니다 :

class A<T extends Number> extends B<T> { 
    public Number f(float j) { 
     return 1f; 
    } 

    public Number f(T j) { 
     return j; 
    } 
} 


public class J { 
    public static void main(String[] args) { 
     A<Float> a = new A<>(); 
     Number r = a.f(2f); 
     System.out.println(r); 
    } 
} 
+0

+1 좋은 설명. –

6

기대하시는 바. 클래스 전자를 오버라이드 (override)하지 않는

public Number f(Float j); 

에서

abstract Number f(T j); 

방법 : 당신은 클래스 B에서 선언 된 하나의 방법이있다. 그들에는 다른 서명이있다. 따라서 방법은

public Number f(T j) { 
    return j; 
} 

이 호출됩니다. 호출 페이지 AF

abstract class B<T extends Number> { 
abstract Number f(T j); 
} 

class A<T extends Number> extends B<T> { 
    public Number f(Float j) //this method does not override the superclass method 

    { 
     return 1f; 
    } 

    public Number f(T j) { 
     return j; 
    } 
} 

public class J { 
    public static void main(String[] args) { 
     B<Float> a = new A<>(); 
     Number r = a.f(2f); 
     System.out.println(r); 
    } 
} 

아래에 코드 (2 층)에서

+0

내가 순진 엄격한 서명'F (플로트)와 메소드를 호출하기를 기다리고 있었다 '대신합니다 'f (T extends Number)' –

1

그것이 J를 반환

public Number f(T j) 
{ 
return j; 
} 

를 호출 발생한다 따라서 제공되는 출력은 그래서 2.0

+0

그래,하지만 * 왜 * 수퍼 클래스 메서드를 재정의하지 않습니까? –

0

floatFloat과 같은 것은 아니다.

자동 권투는 같은을 느낄 수 있지만, 하나의 주요 차이점은 당신이 float 매개 변수에 null를 통과 할 수있다.

나는 재정의 된 방법에 @Override 주석을 사용하는 것이 좋습니다 그래서 컴파일러는 서명이 맞다면 당신에게