2009-03-24 5 views
5

나는 다음과 같은 코드가 있습니다 :수 없습니다

SuperClass: super 
SubClass: sub 
T: super 

내 질문은 : 왜 T하지 않습니다

class SuperClass { 
    public static String getName() { return "super"; } 
} 

class SubClass extends SuperClass { 
    public static String getName() { return "sub"; } 
} 

public class Dummy<T extends SuperClass> { 
    public void print() { 
     System.out.println("SuperClass: " + SuperClass.getName()); 
     System.out.println("SubClass: " + SubClass.getName()); 
     System.out.println("T: " + T.getName()); 
    } 
    public static void main(String[] args) { 
     new Dummy<SubClass>().print(); 
    } 
} 

이 코드는 다음 출력 .getName()은 SubClass.getName()의 값을 반환합니까? 결국, 나는 T == SubClass를 지정했다. 또는 정적 함수 호출이 일반적인 참조에 유효하지 않습니까?

미리 감사드립니다.

답변

13

이것은 일반적인 문제가 아닙니다.

당신이 말한다면 :

SuperClass obj = new SubClass(); 
System.out.println(obj.getName()); 

당신은 또한 "슈퍼"를 얻을 것이다. "다형성"정적 메서드는 없습니다.

귀하의 경우 모든 컴파일러는 T에 대해 알고 있기 때문에 SuperClass을 확장하므로 SuperClass.getName()을 호출합니다.

+0

좋아요, 지금까지 분명합니다. 그런데 어떻게 T를 사용하여 더미에서 정적 메서드 SubClass.getName()을 호출 할 수 있습니까? Dummy가 getName()을 투명하게 호출 할 수있는 많은 하위 클래스를 갖고 싶습니다. – JeffreyHammansson

0

"new Dummy()"로 클래스를 인스턴스화하면 실제로 아무 것도 설정하지 않은 기본 생성자가 호출됩니다. print 메소드가 호출되면, VM은 클래스 선언에 선언 된 T 유형이 SuperClass임을 알았습니다. 그런 다음이 클래스의 정적 메서드를 호출합니다.

1

에만 다음, T의 모든 값에 대해 하나 개의 클래스를 생성하고,이 경우 SuperClass에, T의 슈퍼 타입이 클래스에 T을 입력하는 모든 참조를 변환 그것 때문에 C++ 템플릿 유형 삭제하여 자바 제네릭 작업, 달리 가상 디스패치를 ​​사용하여 객체 메소드에 대한 호출에 대한 분산을 제공하고 정적 메소드에 대한 호출에 대한 정적 디스패치를 ​​제공합니다.

Dummy<SubClass>.print()을 수행 할 때 컴파일러는 DummySubClass의 전역 대체를하지 않습니다. 모든 컴파일러는 Dummy의 메서드에서 인수 또는 반환 형식으로 T의 사용이 SubClass임을 확인합니다. Dummy 안에 어떤 코드도 변경되지 않으므로 T이 무엇이든간에 동일한 SuperClass 정적 메서드가 호출됩니다.

매개 변수화 된 형식에 따라 제네릭 클래스에서 다른 동작을 사용하려면 해당 형식의 개체를 전달하고 가상 메서드를 사용하거나 해당 형식의 클래스를 전달하고 리플렉션을 사용합니다.

관련 문제