> Java > java지도 시간 > Java에서 유형 변수를 사용하여 현재 유형을 어떻게 참조할 수 있습니까?

Java에서 유형 변수를 사용하여 현재 유형을 어떻게 참조할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2024-12-18 08:02:10
원래의
472명이 탐색했습니다.

How Can I Refer to the Current Type with a Type Variable in Java?

현재 타입을 타입 변수로 참조하는 방법이 있나요?

Java에서는 현재 타입을 타입으로 직접 참조하는 것이 불가능합니다. 변하기 쉬운. 문제는 현재 유형의 인스턴스를 반환할 수 있는 메서드를 작성하려고 할 때 발생하며, 이는 하위 유형 지정을 처리할 때 문제가 됩니다. 예를 들어, 기본 클래스에서 반환 유형 T를 사용하여 일반 메서드를 선언하면 실제 하위 클래스 유형이 아닌 하위 클래스의 기본 클래스 유형을 참조하게 됩니다.

재귀 범위와 추상 클래스/인터페이스를 활용하는 해결 방법

이 문제를 해결하기 위해 다음과 같이 재귀 경계와 추상 클래스 계층 구조를 사용할 수 있습니다.

abstract class SelfTyped<SELF extends SelfTyped<SELF>> {
    abstract SELF self();
}

class MyBaseClass<SELF extends MyBaseClass<SELF>>
        extends SelfTyped<SELF> {

    MyBaseClass() { }

    public SELF baseMethod() {
        return self();
    }
}

final class MyLeafClass extends MyBaseClass<MyLeafClass> {

    @Override
    MyLeafClass self() {
        return this;
    }

    public MyLeafClass leafMethod() {
        return self();
    }
}
로그인 후 복사

여기서 접근 방식에서 리프 클래스는 재귀 유형 매개변수 SELF를 자체 유형으로 확인하고 self()를 구현합니다. 리프 클래스를 직접 사용할 수 있으므로 올바른 반환 유형을 유지하면서 메소드 체이닝이 가능합니다.

MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod();

AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
로그인 후 복사

주의: 이 기술은 CRT(Curely Recurring Template Pattern)에 의존하며 특정 위험을 초래합니다. :

  • 유형 대체 취약점: 파생 클래스가 재정의될 수 있음 SELF가 다른 유형을 반환하면 자체 유형 보장이 손상됩니다.
  • 잘못된 self() 구현: self()의 파생 클래스 구현이 현재 인스턴스를 정확하게 반환하지 않을 수 있습니다.

이러한 위험을 완화하려면 관련 클래스가 공개적으로 확장 가능하지 않은지 확인하고 SelfTyped 및 self().

평가 및 사용 고려 사항

이 해결 방법은 현재 유형을 참조하는 수단을 제공하지만 추가적인 복잡성과 제한 사항이 발생합니다. 이를 구현하기 전에 잠재적인 단점과 이점을 신중하게 비교하는 것이 좋습니다. 명시적인 유형 참조가 중요한 경우 이 솔루션이 유용할 수 있지만 지나치게 의존하거나 공개 API에 의존하지 마십시오.

위 내용은 Java에서 유형 변수를 사용하여 현재 유형을 어떻게 참조할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿