>  Q&A  >  본문

问下这两个java的泛型方法的写法不一样, 但效果一样, 使用场景有何不同

定义

    public static void printList(List<?> list) {
        for (Object elem : list){
            System.out.println(elem + " ");
        }
    }

    public static <T> void printList2(List<T> list) {
        for (T elem : list){
            System.out.println(elem + " ");
        }
    }

使用

        MyList.printList(Arrays.asList(1, 2, 3));

        MyList.printList2(Arrays.asList(1, 2, 3));
怪我咯怪我咯2744일 전577

모든 응답(4)나는 대답할 것이다

  • 天蓬老师

    天蓬老师2017-04-18 10:50:45

    <?> 는 제한 없이 임의로 작성 가능합니다.

    <T> T가 나타나는 장소는 동일한 일반 유형이어야 합니다.

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:50:45

    효과는 동일하지만 <T> T가 나타나는 장소가 동일한 유형이어야 한다는 것은 아닙니다. 실제로 위의 두 가지 메서드는 List와 List 모두 하위 수준으로 컴파일됩니다.

    그러나 두 번째 사용법은 실제 개발에 아무런 역할을 하지 않습니다. 제네릭이 반환 값을 선언하는 유형이 아니거나 클래스 수준에서 선언되지 않는 한 이유는 무엇입니까? 예를 들어

    으아아아

    또는

    으아아아

    효과가 있었습니다.

    그렇지 않으면 이렇게 사용하세요 public static <T> void fun1(List<T> list)
    여기서 제네릭의 역할은 무엇인가요? 실제로 어떤 효과가 있는지는 알 수 없습니다. 이런 식으로 사용할 필요는 없다고 말해야합니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:50:45

    ? T와 T는 모두 불확실한 유형을 나타내지만 T를 사용하면 return <T>t;와 같은 객체 작업을 수행할 수 있습니다. 이 경우 T를 대신 사용해야 할까요? .

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 10:50:45

    List<?>List<T>의 상위 클래스이며 List<?>List<T>을 사용할 수 있는 모든 곳에서 사용할 수 있습니다.

    회신하다
    0
  • 취소회신하다