program story

Java Generics WildCard :

inputbox 2020. 12. 5. 09:43
반응형

Java Generics WildCard : vs


이 두 기능의 차이점은 무엇입니까?

static void gPrint(List<? extends Number> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

static <T extends Number> void gPrintA(List<T> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

동일한 출력이 표시됩니다.


T다시 사용되지 않기 때문에이 경우 차이가 없습니다 .

a를 선언하는 이유는 T다시 참조하여 두 개의 매개 변수 유형 또는 반환 유형을 함께 바인딩 할 수 있기 때문입니다 .


차이점은 T와일드 카드 사용할 때 참조 할 수 없다는 것 입니다.

당신은 지금이 아니므로 "차이가 없다"는 것입니다. 그러나 다음 T은 차이를 만드는 데 사용할 수있는 방법입니다.

static <T extends Number> T getElement(List<T> l) {
    for (T t : l) {
        if (some condition)
            return t;
    }
    return null;
}

이것은 전달 된 것과 동일한 유형반환 합니다 . 예를 들어 둘 다 컴파일됩니다.

Integer x = getElement(integerList);
Float y = getElement(floatList);

T당신이 확장 특정 형식에 충실해야 사용 입력 어떤 한정된 유형, 즉되고 Number당신이 전달하는 경우 예를 들어, Double목록에 대한 유형을, 당신은 그것을 전달할 수 없습니다 Short로 유형을 T유형 인 Double하고 목록이 이미 의해 묶여있다 유형. 반대로 ?( wildcard) 를 사용 하면 확장되는 "모든"유형을 사용할 수 있습니다 Number( ShortDouble해당 목록에 모두 추가 ).


T를 사용하면 List에서 모든 유형의 작업을 수행 할 수 있습니다. 단, 사용시 추가를 할 수 없습니다.

T-전체 액세스 권한이있는 객체 참조와 동일
합니까? -부분 접근 권한 부여

static void gPrint(List<? extends Number> l) {
 l.add(1); //Will give error
for (Number n : l) {
    System.out.println(n);
}

static <T extends Number> void gPrintA(List<T> l) {
l.add((T)1); //We can add
for (Number n : l) {
    System.out.println(n);
}

참고 URL : https://stackoverflow.com/questions/11497020/java-generics-wildcard-extends-number-vs-t-extends-number

반응형