질문 답변.
선언 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입니까?
Iterable은 for-each look을 사용할 수있는 간단한 인터페이스입니다. 즉, 클래스 정의가 구현하는 모든 객체를 반복 할 수 있습니다.
왜 printf입니까?
printf 함수를 사용 Formatter, 그것의 이점은 두 있습니다 - element
의 인스턴스가 널 (null)로 할당 된 경우, 당신은 당신이 o.toString()
를 호출하는 경우 발생합니다 널 포인터 예외을받지 않습니다.
무엇이 누락 되었습니까?
그 구현에는 아직 두 가지가 없습니다. - 입력 유효성 확인 - 요소를 혼수로 분리하는 적절한 출력 형식입니다.
이것은 원시 형식이 사용된다는 것을 의미하며이 클래스의 모든 제네릭 형식 검사를 파기합니다. – Marco13