>웹 프론트엔드 >JS 튜토리얼 >제네릭의 모호성 오류

제네릭의 모호성 오류

Barbara Streisand
Barbara Streisand원래의
2024-12-31 06:20:10636검색

Erros de Ambiguidade com Genéricos

1. 모호성 오류란 무엇입니까?

  • 삭제 작업으로 인해 서로 다른 두 개의 제네릭 선언이 동일한 유형으로 변환되어 컴파일 충돌이 발생할 때 발생합니다.
  • 메서드 오버로드와 관련된 시나리오에서 특히 일반적입니다.

2. 모호함의 예: 삭제 과부하

문제가 있는 코드:

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    // Tentativa de sobrecarga
    void set(T o) {
        ob1 = o;
    }

    void set(V o) {
        ob2 = o;
    }
}

오류: 일반 매개변수 T 및 V를 기반으로 set() 메서드를 오버로드하려는 시도는 유효한 것처럼 보이지만 모호성을 유발합니다.

3. 모호한 이유

  • 첫 번째 문제: T와 V는 같은 유형일 수 있습니다.

예:

MyGenClass<String, String> obj = new MyGenClass<>();

여기서 T와 V는 모두 String으로 대체되어 두 버전의 set()이 동일해집니다.

결과:

  • 컴파일러는 두 가지 방법을 구분할 수 없습니다.

두 번째 문제: 삭제하면 유형이 객체로 줄어듭니다.

  • 컴파일하는 동안 두 방법 모두 다음과 같이 변환됩니다.
void set(Object o) {
    // ...
}

이렇게 하면 T와 V 사이의 구분이 없어져 오버로딩이 불가능해집니다.

4. 왜 이런 일이 발생하는 걸까요?

  • 삭제는 일반 유형 정보를 제거하여 해당 경계 유형(또는 경계가 지정되지 않은 경우 객체)으로 바꿉니다.
  • set(T)와 set(V)의 경우 둘 다 컴파일러가 생성한 코드에서 set(Object)로 처리됩니다.

5. 해결책: 일반적인 과부하 방지
모호성을 해결하려면 메서드에 다른 이름을 사용하세요.

수정된 예:

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    void setOb1(T o) {
        ob1 = o;
    }

    void setOb2(V o) {
        ob2 = o;
    }
}

여기서 setOb1()과 setOb2()는 서로 다른 메서드이므로 충돌이 발생하지 않습니다.

6. 결론
이와 같은 모호성은 삭제가 일반 매개변수를 단순 유형(객체)으로 변환하기 때문에 발생합니다.
실수를 방지하려면 다음 방법을 따르십시오.

  • 일반 매개변수를 사용하여 메서드를 오버로드하지 마세요.
  • 다양한 제네릭 유형을 조작하는 메서드에 서로 다른 이름을 지정합니다. 삭제 동작을 이해하면 이러한 문제를 방지하고 일반 클래스를 안전하게 설계하는 데 도움이 됩니다.

위 내용은 제네릭의 모호성 오류의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.