메소드 매개 변수의 일반 유형

저킹

시나리오는 다음과 같습니다.

public static <T> List<T> isTriggeredByBlackList(Map<String, T> params, Class<T> clz)   {
    System.out.println(clz.getName());

    return null;
}

내가 원하는 것은 String또는 List<String>이 방법 을 전달 하는 것입니다.

에 관해서는 String잘 작동합니다.

Map<String, String> map1 = new HashMap<String, String>();
map1.put("11", "22");
isTriggeredByBlackList(map1, String.class);

하지만을 전달하려고하면 List<String>잘못되었습니다.

Map<String, List<String>> map = new HashMap<String, List<String>>();
List<String> l = new ArrayList<String>();
l.add("11");
l.add("22");
map.put("1", l);
isTriggeredByBlackList(map, List.class);    //compile error!

아래와 같이 컴파일 오류 :

The method isTriggeredByBlackList(Map<String,T>, Class<T>) in the type CommonTest is not applicable for the arguments (Map<String,List<String>>, Class<List>)

내가 필요한 것은 유형과 유형 모두에 적합한 하나의 메소드작성하는 것입니다 .StringList<String>

누구든지 나를 도울 수 있습니까? 감사합니다!

isnot2bad

방법의 서명을 변경하십시오.

public static <T> List<T> isTriggeredByBlackList(Map<String, ? extends T> params, Class<T> clz)

왜 이것이 작동합니까?

표현식 ? extends T은 하위 유형 T(물론 T그 자체) 인 모든 유형 이 허용 된다는 것을 의미합니다 .

와일드 카드 란 무엇입니까?

그래서 메소드 isTriggeredByBlackList가 다음과 같이 호출 될 때 :

isTriggeredByBlackList(map, List.class);

... T(raw) List유형 으로 지정 되므로 첫 번째 매개 변수는 여야합니다. Map<String, any-type-that-extends-raw-List>이는 (raw)의 하위 유형 Map<String, List<String>>이기 때문에 true입니다 .List<String>List


그러나 목록이 (원시) 목록의 하위 유형 인 이유는 무엇입니까?

다형성이 예상대로 작동하지 않기 때문에 제네릭은 까다 롭습니다. A List<String> is-NOT-a List<Object> , String확장 하지만 Object! 따라서 이것은 작동하지 않습니다.

List<Object> objList = new ArrayList<String>(); // compile error

(참고 : 이것이 불가능하다는 것은 좋지만 다른 이야기입니다)

그러나이 List<String> A-IS (원료) List(그것은 이다-A List<?> ). 그래서 이것은 작동합니다.

List rawList = new ArrayList<String>(); // just compiler warning
List<?> unknownList = new ArrayList<String>();

그 이유는 원시 유형이 여전히 이전 버전과 호환되도록 지원되기 때문입니다. 그렇지 않으면 제네릭을 지원하지 않는 오래된 코드는 요즘 사용할 수 없습니다. 따라서 구체적인 매개 변수화 된 유형 (예 :)의 인스턴스는 ArrayList<String>원시 유형 (예 :) ArrayList또는 수퍼 유형 (예 :) 의 참조에 할당 될 수 있습니다 List!

원시 유형이 허용되는 이유는 무엇입니까?

왜 우리는 다음과 같은 것을 통과 할 수 List<String>.class없습니까?

매개 변수화 된 유형에는 정확한 런타임 유형 표현이 없기 때문입니다!

구체적인 매개 변수화 된 유형에 대한 클래스 리터럴이없는 이유는 무엇입니까?

그러나 나는 List<List<String>>반환 값 을 얻고 싶다 !

이것은 문제 없습니다! 할당의 왼쪽을 a로 정의 List<List<String>>하면 나머지는 java가 처리합니다.

List<List<String>> l = isTriggeredByBlackList(map, List.class);

그러나! 메서드 선언을 약간 수정 한 경우에만 작동합니다.

public static <T> List<T> isTriggeredByBlackList(
    Map<String, ? extends T> params, Class<? super T> clz)

(그렇지 않으면 원시 List.class를 두 번째 인수로 전달할 수 없습니다 ).


이 모든 수정 및 조정이 합리적이라면 방법이 수행해야하는 작업에 따라 달라집니다! 읽기만 params하나요? 제네릭 유형 인수를 어떻게 사용합니까? 여기서 제네릭을 사용하면 어떤 이점이 있습니까? 기타


Btw .:로 시작하는 메서드 is...boolean값을 반환해야 합니다. 방법의 이름을 바꾸는 것을 고려하십시오! 당신의 메서드의 반환 형식입니다 : BTW 2 List<T>, 그래서 경우에 당신이 지정하고 T을 할 List, 당신은 얻을 것이다 List<List>. 이것은 의도 된 것입니까?

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

일반 메소드 매개 변수의 유형

분류에서Dev

메소드 매개 변수로서의 일반 유형

분류에서Dev

일반 메소드 유형 매개 변수 선언

분류에서Dev

일반 유형 매개 변수를 사용하여 메소드 가져 오기

분류에서Dev

Java Reflection : 메소드의 반환 매개 변수 유형 가져 오기

분류에서Dev

Java Reflection : 메소드의 반환 매개 변수 유형 가져 오기

분류에서Dev

인터페이스가있는 일반 메소드의 경계 유형 매개 변수?

분류에서Dev

Null OR 일반 매개 변수 메소드

분류에서Dev

저장소는 일반 유형의 메소드에서 유형 매개 변수로 사용할 수 없습니다.

분류에서Dev

선택적 일반 매개 변수 유형 축소

분류에서Dev

일반 메소드 매개 변수에 대한 구체적인 유형 값 제공

분류에서Dev

고유 매개 변수를 취하고 고유 매개 변수를 리턴하는 일반 메소드 Java

분류에서Dev

Java 필드 유형 및 일반 매개 변수 상관

분류에서Dev

Java : 특정 유형의 매개 변수로 메소드 호출

분류에서Dev

매개 변수 유형의 클래스를 반환하는 메소드로 인터페이스 구현

분류에서Dev

동일한 유형의 매개 변수로 다른 GET 메소드를 실행하기위한 라우팅

분류에서Dev

일반 유형 매개 변수 오류

분류에서Dev

일반 유형의 일반 매개 변수 가져 오기

분류에서Dev

Java는 일반 유형 매개 변수가있는 메소드와 일반 매개 변수가 아닌 다른 메소드가있을 때 호출 할 오버로드 된 메소드를 어떻게 결정합니까?

분류에서Dev

일반 매개 변수 'T'를 유추 할 수 없음 : 일반 웹 서비스 메소드에서

분류에서Dev

Java에서 일반 메소드 호출 : 유형을 일반 매개 변수 T로 변환 할 수 없습니다.

분류에서Dev

반환 된 매개 변수에 대한 useReducer의 일반 유형

분류에서Dev

일반 유형 매개 변수를 매개 변수로 사용

분류에서Dev

Java 일반 메소드 유형 인수

분류에서Dev

저장소 구현에 매개 변수화 된 유형의 메소드 필요

분류에서Dev

EL에서 매개 변수화 된 메소드 호출의 인수 유형

분류에서Dev

Avice에서, 권장 메소드의 매개 변수의 '유형 매개 변수'를 얻는 방법

분류에서Dev

일반 매개 변수의 공용체 유형

분류에서Dev

생성자 매개 변수로서의 일반 유형

Related 관련 기사

  1. 1

    일반 메소드 매개 변수의 유형

  2. 2

    메소드 매개 변수로서의 일반 유형

  3. 3

    일반 메소드 유형 매개 변수 선언

  4. 4

    일반 유형 매개 변수를 사용하여 메소드 가져 오기

  5. 5

    Java Reflection : 메소드의 반환 매개 변수 유형 가져 오기

  6. 6

    Java Reflection : 메소드의 반환 매개 변수 유형 가져 오기

  7. 7

    인터페이스가있는 일반 메소드의 경계 유형 매개 변수?

  8. 8

    Null OR 일반 매개 변수 메소드

  9. 9

    저장소는 일반 유형의 메소드에서 유형 매개 변수로 사용할 수 없습니다.

  10. 10

    선택적 일반 매개 변수 유형 축소

  11. 11

    일반 메소드 매개 변수에 대한 구체적인 유형 값 제공

  12. 12

    고유 매개 변수를 취하고 고유 매개 변수를 리턴하는 일반 메소드 Java

  13. 13

    Java 필드 유형 및 일반 매개 변수 상관

  14. 14

    Java : 특정 유형의 매개 변수로 메소드 호출

  15. 15

    매개 변수 유형의 클래스를 반환하는 메소드로 인터페이스 구현

  16. 16

    동일한 유형의 매개 변수로 다른 GET 메소드를 실행하기위한 라우팅

  17. 17

    일반 유형 매개 변수 오류

  18. 18

    일반 유형의 일반 매개 변수 가져 오기

  19. 19

    Java는 일반 유형 매개 변수가있는 메소드와 일반 매개 변수가 아닌 다른 메소드가있을 때 호출 할 오버로드 된 메소드를 어떻게 결정합니까?

  20. 20

    일반 매개 변수 'T'를 유추 할 수 없음 : 일반 웹 서비스 메소드에서

  21. 21

    Java에서 일반 메소드 호출 : 유형을 일반 매개 변수 T로 변환 할 수 없습니다.

  22. 22

    반환 된 매개 변수에 대한 useReducer의 일반 유형

  23. 23

    일반 유형 매개 변수를 매개 변수로 사용

  24. 24

    Java 일반 메소드 유형 인수

  25. 25

    저장소 구현에 매개 변수화 된 유형의 메소드 필요

  26. 26

    EL에서 매개 변수화 된 메소드 호출의 인수 유형

  27. 27

    Avice에서, 권장 메소드의 매개 변수의 '유형 매개 변수'를 얻는 방법

  28. 28

    일반 매개 변수의 공용체 유형

  29. 29

    생성자 매개 변수로서의 일반 유형

뜨겁다태그

보관