2014-02-24 4 views
0

실습을 위해 ArrayList 요소를 표시하는 일반적인 방법을 .toString() 메서드 호출로 작성하려고합니다. .toString()이 내가 원하는 것을 수행한다고 가정하십시오.모든 유형의 ArrayList 요소를 인쇄하는 일반적인 방법

나는 나의 입력 ArrayList 유형 Object의 어디 아래에이 솔루션을 내놓았다 :

public void printArralyList(ArrayList<Object> list){ 
    for(Object o:list){ 
     System.out.print(o.toString()); 
    } 
    System.out.println(); 
} 

그러나이 작동하지 않을 것입니다!

printArralyList(new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21))); 

나는 그것을 해결하는 방법을 내가받을 컴파일 오류가

The method printArralyList(ArrayList<Object>) is not applicable 
for the arguments (ArrayList<Integer> 

입니까?

답변

2

IntegerObject이더라도 ArrayList<Integer>ArrayList<Object>이 아닙니다.

제네릭 형식 매개 변수의 형식이 마음에 들지 않으므로 메서드 매개 변수에 와일드 카드가 필요합니다.

public void printArralyList(ArrayList<?> list){ 

덧붙여, 당신은 당신의 방법 대신 ArrayListList을 가질 수 있고, ArrayList에서 Arrays.asList의 반환을 포장 할 필요가 없을 것입니다 :

public void printArralyList(List<?> list){ 

printArralyList(Arrays.asList(1,2,3,5,8,13,21)); 

이 작동합니다.

0

제네릭이나 와일드 카드가 필요하지 않습니다. 필요한 것은 ArrayList를 언제든지 전달할 수 있도록 인수의 유형을 지정하지 않는 간단한 메소드뿐입니다. 이 목적을 실행하기위한 경우

public void printArralyList(ArrayList list){ 
    for (Object o:list){ 
     System.out.print(o.toString()); 
    } 
    System.out.println(); 
} 
+0

이것은 원시 형식이 사용된다는 것을 의미하며이 클래스의 모든 제네릭 형식 검사를 파기합니다. – Marco13

0

오류에 대한 이유는, 당신은이를 사용할 수 있습니다 연습 다형성과 programming to an interface

public static void printIterable(Iterable<?> iterable) 
{ 
    for (Object object : iterable) 
    { 
     System.out.print(object); 
    } 
    System.out.println(); 
} 

고려해야한다, 그러나

https://stackoverflow.com/a/21996188/에 rgettman에 의해 설명되었다 ArrayList<Integer> 매개 변수뿐만 아니라 LinkedHashSet<JComponent> 또는 Iterable 인터페이스를 구현하는 기타 요소를 포함 할 수 있습니다.

0

질문 답변.

선언 ArrayList는 ArrayList와 동일하지 않습니다. 형식 계층에서 Object에서 Integer이 배달 되더라도. 기억해야 할

중요한 것은 당신이 Collection<String> myStrings을 선언 할 때, 당신은 String 유형에 따라 작성 모음하는 클래스의 인스턴스를 할당 할 수있는 변수 myString에 있음을 컴파일러에게 전하고 있다는 것입니다.

Collection<Object> myObjects; 

myObjects = new ArrayList<String>(); //Exception 
myObjects = new HashSet<String>(); //Exception 
myObjects = new HashSet<Object>(); //Valid 
myObjects = new ArrayList<Object>(); //Valid 
myObjects = new ArrayList<Integer>(); //Exception 

것은 그 같은 문제를 해결하기 위해, 자바는 당신이 전달할 수 있도록 Wildcars 세트 제공합니다.

다양한 variances을 지원하는 3 가지 종류의 의지 카드가 있습니다.

<? extends T> - Covariance 
<? super T> - Contravariance 
<?>   - Invariance/ 

그들에 대한 규칙은 공분산을 사용해야 컴파일 오류를 제거하기 위해,

우리는리스트의 요소를 소비 할 것처럼 PECS라고합니다. 자바의 모든 클래스가 객체에서 전달되기 때문에

Collection<? extends Object> myObjects; 

myObjects = new ArrayList<String>(); //Valid 
myObjects = new HashSet<String>(); //Valid 
myObjects = new HashSet<Object>(); //Valid 
myObjects = new ArrayList<Object>(); //Valid 
myObjects = new ArrayList<Integer>(); //Valid 

그렇게 <? extends><?> 기능적으로 동일하고, 그 rgettman이 대답

자바 컬렉션 프레임 워크가 generics 지원됩니다 제안했다 것입니다. 이 프레임 워크를 충분히 활용하려면 익숙해 져야합니다.

public static <T> void printList<Iterable<T> iterable) { 

    for(T element : iterable){ 
     System.out.printf("%s ",element); 
    } 
    System.out.println(); 
} 

왜 정적 :

는 해결하기위한 다른 방법은 다음과 같이 일반적인 방법의 혜택을 무엇입니까?

정적 메서드 호출이 빠르며이 메서드는 클래스 멤버와 관련이 없습니다.

무엇입니까?

이것은 generic method의 선언입니다. 일반 매개 변수의 값을 정의 할 수 있습니다. 그리고 Java는 버전 7에서 그 자체로 추출 할 수있는 예민합니다.

Iterable<String>으로 메소드를 호출하면 Iterable, then Integer 인 경우 T의 값은 String이됩니다.

왜 Iterable입니까?

Iterablefor-each look을 사용할 수있는 간단한 인터페이스입니다. 즉, 클래스 정의가 구현하는 모든 객체를 반복 할 수 있습니다.

왜 printf입니까?

printf 함수를 사용 Formatter, 그것의 이점은 두 있습니다 - element의 인스턴스가 널 (null)로 할당 된 경우, 당신은 당신이 o.toString()를 호출하는 경우 발생합니다 널 포인터 예외을받지 않습니다.

무엇이 누락 되었습니까?

그 구현에는 아직 두 가지가 없습니다. - 입력 유효성 확인 - 요소를 혼수로 분리하는 적절한 출력 형식입니다.

관련 문제