>Java >java지도 시간 >Java의 제네릭 사용법 요약

Java의 제네릭 사용법 요약

高洛峰
高洛峰원래의
2017-01-18 11:19:581387검색

이 기사의 예에서는 Java의 제네릭 사용법을 요약합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

1 기본 사용

public interface List<E> {
 void add(E);
 Iterator<E> iterator();
}

2 Generics 및 하위 클래스

Child는 Parent의 하위 클래스이지만 Listad7a74ca7e6896ff8ac9eb8e25d760c6 List294ec52526076f8c76b491d15e4edc9c의 하위 클래스가 아닙니다.
그러므로 List list = new ArrayList()이 잘못되었습니다.
위의 내용이 맞다면:

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 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.