문제

다음 코드가 있습니다.

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();
    }
}

이 코드는 다음을 출력합니다.

SuperClass: super
SubClass: sub
T: super

내 질문은 다음과 같습니다T.getName()이 SubClass.getName()의 값을 반환하지 않는 이유는 무엇입니까?결국 나는 T == SubClass를 지정했습니다.아니면 일반 참조에 대해 정적 함수 호출이 유효하지 않습니까?

많은 감사드립니다!

도움이 되었습니까?

해결책

이것은 제네릭에 대한 문제가 아닙니다.

당신이 말하는 경우:

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

당신은 또한 "슈퍼"를 얻을 것입니다. "다형성"정적 방법은 없습니다.

귀하의 경우, 모든 컴파일러는 알고 있습니다 T 그것이 확장된다는 것입니다 SuperClass, 그래서 전화 할 것입니다 SuperClass.getName().

다른 팁

C++ 템플릿과 달리 Java 제네릭은 유형 삭제를 통해 작동하므로 모든 값에 대해 하나의 클래스만 생성합니다. T, 모든 참조를 유형으로 변환합니다. T 이 수업에서는 슈퍼 유형의 T, 이 경우 SuperClass, 그런 다음 가상 디스패치를 ​​사용하여 객체 메서드 호출에 대한 분산을 제공하고 정적 메서드 호출에 정적 디스패치를 ​​사용합니다.

그래서 당신이 할 때 Dummy<SubClass>.print(), 컴파일러는 전역 대체를 수행하지 않습니다. T ~와 함께 SubClass ~에 Dummy.컴파일러가 하는 모든 일은 다음의 사용을 확인하는 것입니다. T 메서드의 인수 또는 반환 유형으로 Dummy ~이다 SubClass.내부 코드에는 변화가 없습니다. Dummy, 그래서 같은 SuperClass 정적 메소드는 무엇이든 호출됩니다. T 이다.

매개변수화된 유형에 따라 일반 클래스에서 다른 동작을 원하는 경우 해당 유형의 객체를 전달하고 가상 메서드를 사용하거나 해당 유형의 클래스를 전달하고 리플렉션을 사용합니다.

"New Dummy ()"로 클래스를 심어 주면 실제로 아무것도 설정하지 않는 기본 생성자를 불렀습니다. 인쇄 방법이 호출되면 VM은 클래스 선언에서 선언 된 T 유형이 수퍼 클래스임을 보았다. 그런 다음이 클래스에서 정적 메소드를 호출합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top