이 기사의 예에서는 Java의 제네릭 사용법을 요약합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.
1 기본 사용
public interface List<E> { void add(E); Iterator<E> iterator(); }
2 Generics 및 하위 클래스
Child는 Parent의 하위 클래스이지만 Listad7a74ca7e6896ff8ac9eb8e25d760c6 List294ec52526076f8c76b491d15e4edc9c의 하위 클래스가 아닙니다.
그러므로 List
List<String> ls = new ArrayList<String>(); //1 List<Object> lo = ls; //2 lo.add(new Object()); // 3 String s = ls.get(0); // 4,将object转换为string将失败。
와일드카드 3개
이유 2로 인해 다음 구현은 통합 출력에 사용할 수 없습니다. set
void printCollection(Collection<Object> c) { for (Object o: c) { // do something } }
따라서 와일드카드 ?가 필요합니다.
void printCollection(Collection<?> c) { for (Object o: c) { // 1 // do something } } // ok
여기서 ?는 유형을 알 수 없지만 모든 개체가 개체이므로 위의 1을 의미합니다. 예가 맞습니다. 그러나 다음 예는 잘못되었습니다.
void add(Collection<? extends MyClass> c) { c.add(new MyClass()); // wrong } // ok
이유도 매우 명확합니다. ?extends MyClass는 유형이 MyClass의 하위 클래스이지만 특정 유형을 알 수 없음을 나타냅니다.
4. 일반 메서드
위의 예는 다음과 같이 구현할 수 있습니다.
<T> add(Collection<T> c, T t) { c.add(t); }
컴파일러는 의미 체계를 보장하면서 유형 변환을 지원합니다.
5. 제네릭 런타임 비교
List<String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getClass()); // true
제네릭 클래스의 런타임은 동일하기 때문입니다.
6개의 일반 배열(잠재적으로 유형이 안전하지 않음)
List<String>[] lsa = new ArrayList<String>[10]; // error
가능한 경우 유형이 안전하지 않을 수 있습니다. 예:
Object o = lsa; Object []oa = (Object[])o; List<Integer> li = new ArrayList<Integer>(); li.add(new Integer(3)); oa[1] = li; String s = lsa[1].get(0); // runtime error
이 기사가 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.
Java의 제네릭 사용법 요약과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!