자바 의 범 형 / 범 형
자바 범 형의 인 자 는 클래스 만 대표 할 수 있 고 개별 대상 을 대표 할 수 없습니다.자바 범 형의 유형 매개 변수의 실제 유형 은 컴 파일 할 때 제거 되 기 때문에 실행 할 때 유형 매개 변수의 유형 을 알 수 없고 기본 값 형식 을 범 형 매개 변수 로 직접 사용 할 수 없습니다.자바 컴 파일 러 는 범 형 을 컴 파일 할 때 자동 으로 형식 변환 인 코딩 을 추가 하기 때문에 범 형 을 사용 해서 실행 속도 가 빨 라 지지 않 습 니 다.
실행 할 때 일반적인 대상 인 스 턴 스 유형 정보 등 결함 을 없 애 는 것 이 자주 지적 되 기 때문에 자바 및 JVM 의 개발 에 도 이 문 제 를 해결 하려 고 시도 한다. 예 를 들 어 자바 는 바이트 코드 를 생 성 할 때 유형 유도 보조 정 보 를 추가 하여 반사 인 터 페 이 스 를 통 해 일부 일반적인 정 보 를 얻 을 수 있다.JVM 에서 의 범 형 개선 을 통 해 기본 값 유형 범 형 을 지원 하고 범 형 정 보 를 직접 얻 을 수 있 도록 합 니 다.
자바 는 개별 범 형의 유형 매개 변 수 를 제약 할 수 있 습 니 다. 다음 과 같은 두 가지 형식 (가설
T
은 범 형의 유형 매개 변수 이 고 C
은 일반 류, 범 류 또는 범 형의 유형 매개 변수 입 니 다) 을 포함 합 니 다.T
인터페이스 실현 I
.T
은 C
또는 계승 C
이다.범용 since jdk 1.5
에서 따 온 범 형의 본질은 매개 변수 화 유형 이 고 조작 한 데이터 유형 은 하나의 매개 변수 로 지정 된다.자바 의 범 형 은 컴 파일 러 에서 이 루어 지 는 것 이지 가상 컴퓨터 에서 이 루어 지 는 것 이 아니 라 가상 컴퓨터 는 범 형 에 대해 아무것도 모른다.따라서 컴 파 일 러 는 반드시 범 형 류 를 일반 류 로 수정 해야만 가상 컴퓨터 에서 운행 할 수 있다.자바 에 서 는 이 기술 을 지우 기 라 고 부 르 며, 일반적인 코드 는 지우 기 를 거 쳐 원생 유형 으로 변 한다.
소스 코드 > > > 일반 형 > > 컴 파일 러 > > > 바이트 코드 (*. class 파일) > > > JVM (클래스 로 더, 바이트 코드 검사 기, 해석 기) > > > 운영 체제 플랫폼
일반적인 장점 을 사용 하 다.
유형 안전 및 유형 변환 필요 없 음
유형 보안: 우 리 는 범 형 에 한 가지 유형의 대상 만 저장 할 수 있 습 니 다.그것 은 다른 대상 을 저장 할 수 없다.따라서 유형 전환 도 필요 없다.다음은 범 형 을 사용 하 는 것 과 범 형 을 사용 하지 않 는 것 의 차 이 를 보 여 준다.
List list = new ArrayList();
list.add("Hello Generics");
String s = (String) list.get(0); //
List list = new ArrayList();
list.add("Hello Generics");
String s = list.get(0); //
형식 검사 가 실 행 될 때 컴 파일 로 이동 할 때
컴 파일 시 검사: 컴 파일 할 때 검사 하기 때문에 실행 할 때 문제 가 발생 하지 않 습 니 다.좋 은 프로 그래 밍 전략 은 컴 파일 할 때 이 문 제 를 처리 하 는 것 이 실행 할 때 보다 훨씬 좋다 는 것 을 나타 낸다.
일반적인 주의사항 사용
List intList = new ArrayList();
intList.add(1); // 1 Integer
intList.add(2);
개발 자 들 은 범 형 을 사용 할 때 자신의 직관 에 따라 실 수 를 하기 쉽다.예 를 들 어 하나의 방법 이 List 를 형식 매개 변수 로 받 아들 이면 하나의 List 의 대상 을 실제 매개 변수 로 전송 하려 고 시도 하지만 컴 파일 을 통 해 전달 할 수 없 음 을 발견 합 니 다.직관 적 으로 오 브 젝 트 는 String 의 부류 이지 만 이런 유형의 전환 은 합 리 적 이 어야 한다.그러나 실제로는 함 축 된 유형 전환 문제 가 발생 하기 때문에 컴 파 일 러 는 이런 행 위 를 직접 금지한다.http://www.infoq.com/cn/articles/cf-java-generics
일반적인 사용 예
매개 변수 화 형식 만 들 기 - 일반 클래스
//simple
class MyGen {
T obj;
void add(T obj) {
this.obj = obj;
}
T get() {
return obj;
}
}
public class Generics {
public static void main(String args[]) {
MyGen m = new MyGen();
m.add(2);
//m.add("test"); //Compile time error
System.out.println(m.get());
}
}
//complex from agile java
import java.util.*;
public class MultiHashMap {
private Map> map = new HashMap>();
public static ,V> List
sortedKeys(MultiHashMap map) {
List keys = new ArrayList();
keys.addAll(map.keys());
Collections.sort(keys);
return keys;
}
public Set keys() {
return map.keySet();
}
public int size() {
return map.size();
}
public void put(K key, V value) {
List values = map.get(key);
if (values == null) {
values = new ArrayList();
map.put(key, values);
}
values.add(value);
}
public List get(K key) {
return map.get(key);
}
protected Set>> entrySet() {
return map.entrySet();
}
public interface Filter {
boolean apply(T item);
}
public static void filter(final MultiHashMap target,
final MultiHashMap source,
final Filter super V> filter) {
for (K key : source.keys()) {
final List values = source.get(key);
for (V value : values)
if (filter.apply(value))
target.put(key, value);
}
}
}
일반적인 방법
public class Generics {
public static < E > void printArray(E[] elements) {
for ( E element : elements){
System.out.println(element );
}
System.out.println();
}
public static void main( String args[] ) {
Integer[] intArray = {6, 66, 666};
String[] stringArray = { "6","66","666" };
System.out.println( "Printing Integer Array" );
printArray( intArray );
System.out.println( "Printing String Array" );
printArray( stringArray );
}
}
상한 선
모든 유형의 매개 변 수 는 Object 로 결 성 된 상한 선 이 있 습 니 다. 유형 매개 변 수 를 서로 다른 상한 선 으로 제한 할 수 있 습 니 다.이것 은 extends 키 워드 를 사용 하여 특정한 유형의 매개 변수의 상한 선 을 지정 해 야 합 니 다.
//from agile java
import java.util.*;
public class EventMap
extends MultiHashMap {
public List getPastEvents() {
List events = new ArrayList();
for (Map.Entry> entry: entrySet()) {
K date = entry.getKey();
if (hasPassed(date))
events.addAll(entry.getValue());
}
return events;
}
private boolean hasPassed(K date) {
Calendar when = new GregorianCalendar();
when.setTime(date);
Calendar today = new GregorianCalendar();
if (when.get(Calendar.YEAR) != today.get(Calendar.YEAR))
return when.get(Calendar.YEAR) < today.get(Calendar.YEAR);
return when.get(Calendar.DAY_OF_YEAR) <
today.get(Calendar.DAY_OF_YEAR);
}
}
마스크 와 일 드 카드
자바 에서 어댑터 를 사용 할 수 있 습 니까?임의의 가능 한 유형 을 표시 합 니 다. 또한 extends 자 구 를 사용 하여 마스크 의 상한 선 을 제한 할 수 있 습 니 다.
import java.util.ArrayList;
import java.util.List;
abstract class Shape {
abstract void draw();
}
class Rectangle extends Shape {
void draw() {
System.out.println("drawing rectangle");
}
}
class Circle extends Shape {
void draw() {
System.out.println("drawing circle");
}
}
public class Generics {
// creating a method that accepts only child class of Shape
public static void drawShapes(List extends Shape> lists) {
for (Shape s : lists) {
s.draw(); // calling method of Shape class by child class instance
}
}
public static void main(String args[]) {
List list1 = new ArrayList();
list1.add(new Rectangle());
List list2 = new ArrayList();
list2.add(new Circle());
list2.add(new Circle());
drawShapes(list1);
drawShapes(list2);
}
}
demo 원본
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.