서른둘
앞에서 집합을 배울 때 우리는 집합에 임의의 대상을 저장할 수 있다는 것을 알고 있다. 대상을 집합에 저장한 후에 그들은 모두 Object 유형으로 향상될 것이다.우리가 모든 대상을 추출하고 해당하는 조작을 할 때 반드시 유형 변환을 사용해야 한다.예를 들어 다음 절차는 다음과 같습니다.
public class GenericDemo {
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc");
list.add("sxt");
list.add(5);// ,
Iterator it = list.iterator();
while(it.hasNext()){
// , String
String str = (String) it.next();
System.out.println(str.length());
}
}
}
프로그램이 실행될 때 문제가 발생했습니다java.lang.ClassCastException에서 유형 변환 예외가 발생한 이유는 무엇입니까?우리가 분석해 보자. 집합 중의 어떤 유형의 원소도 저장할 수 있기 때문이다.체크 아웃을 수행할 때 강제 회전이 발생하면 런타임 ClassCastException이 발생합니다.어떻게 이 문제를 해결합니까?집합을 사용할 때는 집합 중의 원소의 유형을 명확하게 해야 한다.이런 방식을 범형이라고 부른다.
2. 일반적인 정의와 사용
1. 범형류의 정의와 사용
: class { }
: ,
: ( ){ }
: ,
: interface { }
사용 형식:
1、
2、 , ,
3. 범용성을 사용하는 장점
public class GenericDemo {
public static void main(String[] args) {
Collection list = new ArrayList();
list.add("abc");
list.add("sxt");
//list.add(5);// ,
// , ,
Iterator it = list.iterator();
while(it.hasNext()){
String str = it.next();
// Iterator , 。 String
System.out.println(str.length());
}
}
}
4. 반성 어댑터>
범형은 데이터 형식을 한정하는 것이다. 집합이나 다른 곳에서 범형을 사용한 후에 이때 범형의 데이터 유형을 명확하게 하면 사용할 때 데이터 유형과 일치하는 유형만 전달할 수 있고 그렇지 않으면 오류가 발생할 수 있다.코드 데모:
public static void printCollection(Collection list) {
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
상기 정의된 printCollection 방법에서 정의된 것은 인쇄 집합 기능이기 때문에 임의의 집합 중의 요소를 인쇄할 수 있어야 한다.그러나 방법을 정의할 때 구체적인 집합 중의 원소 유형이 무엇인지 도무지 확정할 수 없다.이'구체적인 집합 중의 원소 유형을 확정할 수 없음'문제를 해결하기 위해java에서 우리에게
>
를 제공하였다.위의 방법을 수정한 후, 임의의 원소 유형을 교체할 수 있는 집합을 실현하였다.public static void printCollection(Collection> list) {
Iterator> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
총괄적으로 말하자면 범형 클래스나 인터페이스를 사용할 때 전달된 데이터 중 범형 유형이 확실하지 않으면 어댑터 > 를 통해 표시할 수 있다.그러나 범용 어댑터를 사용하면 Object 클래스의 공통 방법만 사용할 수 있고 집합의 원소 자체 방법은 사용할 수 없습니다.
5. 범주형 한정
상술한 인쇄 집합의 기능은 매우 강해 보이며 임의의 집합을 인쇄할 수 있지만 문제도 생겼다.인쇄된 집합의 요소 형식을 제한하려면 지정한 종류만 인쇄합니다.어떻게 할까?이 문제를 해결하려면 우리는 범형의 한정을 배워야 한다.
: extends E>
: super E>
실례: 학생과 노동자의 집합을 인쇄할 수 있도록 아래의 방법을 수정한다.
class Student extends Person{ }
class Worker extends Person{ }
public static void printCollection(Collection> list) {
Iterator> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
분석해 보면 학생과 노동자의 공통된 유형인 Person을 찾을 수 있다.그렇다면 범형의 한정은 이렇게 쓸 수 있다:?extends Person: Person 유형 또는 Person의 하위 유형을 받습니다.수정 방법은 다음과 같습니다.
public static void printCollection(Collection extends Person> list) {
Iterator extends Person> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.