2014-01-06 6 views
8

나는 "의 Iterable"인터페이스일반 목록 인쇄 방법

public class List<T> { 

    public static <T extends Iterable<T>> void print(T[] list){ 
     for (Object element : list){ 
      System.out.println(element); 
     } 
    } 
    public static void main(String[] args){ 
     ArrayList<Integer> l = new ArrayList(); 
     l.add(1); 
     l.add(5); 
     l.add(3); 
     l.add(2); 
     print(l); 
    } 
} 

를 구현하는 모든 클래스에 대해 작동하는 일반적인 인쇄 방법을 쓰기를 시도하고 있지만 오류 "방법 인쇄 (T [])에 나타납니다 (ArrayList) 인수에 대해 List가 적용되지 않습니다. "

+0

아마도 클래스 이름을'List'라고하고 싶지 않을 것입니다. 또한'class List '의'T'는'public static >'void print (T [] list)'의'T'와는 다릅니다. – GriffeyDog

답변

7

매개 변수는 T[]입니다. 어떤 배열은 Iterable을 확장하는 형식입니다. 당신은 단순히 T을 원할뿐입니다. 그러나 Iterable에 type 매개 변수에 대한 유형 변수가 필요합니다. 당신은 당신이 당신의 현재 구현에 무엇 인 Iterable<ArrayList>을 원하지 않는이 때문에

public static <T extends Iterable<E>, E> void print(T list) { 

당신이 필요합니다. TIterable를 확장하는 경우

+7

너무 빨리 읽지 않으면'print (Iterable )'도 괜찮을 것이라고 생각합니다. –

+0

@PaulBellora 네, 맞아요. 그것도 작동합니다 (이 경우 아마 더 좋을 것입니다). 제네릭으로 게임하는 것은 재미 있습니다. –

0

그럼 그냥 이렇게 :

public static <E, T extends Iterable<E>> void print(T list){ 
     for (Object element : list){ 
      System.out.println(element); 
     } 
} 

편집 : 당신이 선언 한 것은 예를 들어 당신이 달성하려고하는지 아마 아닙니다의 Iterable 될 수 T extends Iterable<T>했다. 그런 다음 목록의 다른 유형을 추가하십시오.

<T extends Iterable<?>> 
+0

컴파일도되지 않습니다. –

+0

그래, 나는 그저 옳지 않은 그의 일반적인 정의를 좀 더 자세히 살펴볼 것이다. –

4

귀하의 일반적인 정의가 정확하지 : 특별히 유형이 작동하지 않는 경우

는 또한으로 일반 유형을 선언 할 수 있습니다. 경계를 <T extends Iterable<T>>으로 설정하려고하지만 일반 매개 변수 (Integer)가 T이 아닙니다.

별도의 제네릭 매개 변수를 도입하여 컬렉션을 나타낼 수있는 컬렉션 매개 변수와 컬렉션 값을 나타내는 컬렉션 매개 변수를 소개 할 수 있습니다.

사이드 노트 : T[]은 전혀 필요하지 않습니다. 너는 단지 T을 원한다. System.out.println으로

public class Main { 
    public static void main(String[] args) { 
     ArrayList<Integer> l = new ArrayList<>(); 
     l.add(1); 
     l.add(5); 
     l.add(3); 
     l.add(2); 
     print(l); 
    } 

    public static <S, T extends Iterable<S>> void print(T list){ 
     for (Object element : list){ 
      System.out.println(element); 
     } 
    } 
} 

출력

1 
5 
3 
2 
2

모든 Object의를 수용하고, 방법 안에, 내가 모든 제네릭을 사용하는 이유를 볼 수 없습니다 당신은 정말 당신의 제네릭을 사용하지 않는 것입니다. 이 코드는 같은 일을 수행합니다 :

public static void print(Iterable<?> list) { 
    for (Object element : list) { 
     System.out.println(element); 
    } 
} 
당신은 내가 아니라 당신이 T[] 꽤 혼란 것을 추가 할

했을 무엇


. T[]은 " 유형 T"의 의미입니다. 하지만 ArrayList배열 (클래스 ArrayList은 내부적으로 일반 배열을 사용하지만 그와는 무관합니다)과 동일하지 않습니다.

의 원래 메소드 선언을 살펴 보자 :

이 방법은 매개 변수 받아들이 선언
public static <T extends Iterable<T>> void print(T[] list) { 
    for (Object element : list) { 
     System.out.println(element); 
    } 
} 

: 일반 타입 (T)가 일반 이상의 Iterable있는 제네릭 형식 T의 배열을 유형

이의 다시 그 마지막 부분을 읽어 보자 T. : 일반 타입 T는 제네릭 형식의 T.

이상의 Iterable입니다 은 일반 유형 자체에 대한 반복자이어야한다.

이 현재 print 방법을 사용하는 것처럼 당신은 클래스를 필요

:

class MyClass implements Iterable<MyClass> { 
    ... 
} 

을 그리고 다음과 같은 인쇄 방법을 사용 : 그것은 것 현재의 인쇄 방법,

MyClass[] objects = new MyClass[5]; 
print(objects); 

그러나 배열의 5 개 요소 각각에 대해서만 MyClass.toString 메서드를 호출하십시오.