아 너무 어려워
내 생각
class Foo<T> implements Bar<T>{
내 생각
class Foo<T> implements Bar<T>{
public static <V> Foo<V> hooney(){ return new Foo<V>();}
main(){ Foo<String> foo = Foo.hooney();};
main(){ Foo<String> foo = Foo.hooney();};
}
컴파일러는 타입 변수를 추론한다. 위의 예제에서는 <String>이라고 하였으므로, 컴파일러는 String, Object, Serializable 등을 추론할 수 있다. 컴파일러는 가장 구체적인 타입을 선택한다. 그러므로 String이 선택된다.
<String>이 선택되었으므로 hooney()메소드에서 타입 변수인 V는 String으로 대치된다.
그러므로 위와 같은 구문은 올바른 구문이 된다.
매개변수화된 타입을 제거하고 남은 타입을 원시타입이라고 한다. Cell<E> -> Cell (raw type)
타입변수의 제거는 첫번째 경계를 제거하는 것이다. <E>에서 E를 제거한 결과는 묵시적 상위 경계인 Object이다.
<E extends Number>는 묵시적으로 Number가 된다.
<E extends Number & Cloneable> 에서도 첫번째 경계가 Number이기 때문이다.
컴파일러는 타입 제거를 위한 클래스 정보를 생성한다.
매개변수화된 타입을 사용하고 제네릭 타입 제거 시의 타입 정보가 요구되는 타입 정보와 일치하지 않는다면 컴파일러는 캐스트를 삽입한다.
예를들어
List<String> list = new ArrayList<String>();
String s = list.remove();
컴파일러는 String으로 캐스트하는 코드를 추가할 것이다.
런타임시 제거
타입 매개변수로만 표현할 수 있는 타입은 인스턴스화할 수 없다. new T() //error
요소 타입이 매개변수화된 타입인 배열은 생성할 수 없다. new ArrayList<String>[1] //error
하지만, 비경계 와일드카드인 매개변수화된 타입의 배열은 생성가능 new ArrayList<?>[1] //success
instanceof 매개변수화된 타입의 인스턴스인지는 알 수 없다.
하지만, 비경계 와일드 카드인 매개변수화된 타입의 배열은 생성할 수 있다.
instanceof 검사는 런타임에 수행되며 런타임 시에 매개변수화된 타입은 이 타입을 제거한 결과로 교체된다.
컴파일러는 타입 변수를 추론한다. 위의 예제에서는 <String>이라고 하였으므로, 컴파일러는 String, Object, Serializable 등을 추론할 수 있다. 컴파일러는 가장 구체적인 타입을 선택한다. 그러므로 String이 선택된다.
<String>이 선택되었으므로 hooney()메소드에서 타입 변수인 V는 String으로 대치된다.
그러므로 위와 같은 구문은 올바른 구문이 된다.
매개변수화된 타입을 제거하고 남은 타입을 원시타입이라고 한다. Cell<E> -> Cell (raw type)
타입변수의 제거는 첫번째 경계를 제거하는 것이다. <E>에서 E를 제거한 결과는 묵시적 상위 경계인 Object이다.
<E extends Number>는 묵시적으로 Number가 된다.
<E extends Number & Cloneable> 에서도 첫번째 경계가 Number이기 때문이다.
컴파일러는 타입 제거를 위한 클래스 정보를 생성한다.
매개변수화된 타입을 사용하고 제네릭 타입 제거 시의 타입 정보가 요구되는 타입 정보와 일치하지 않는다면 컴파일러는 캐스트를 삽입한다.
예를들어
List<String> list = new ArrayList<String>();
String s = list.remove();
컴파일러는 String으로 캐스트하는 코드를 추가할 것이다.
런타임시 제거
타입 매개변수로만 표현할 수 있는 타입은 인스턴스화할 수 없다. new T() //error
요소 타입이 매개변수화된 타입인 배열은 생성할 수 없다. new ArrayList<String>[1] //error
하지만, 비경계 와일드카드인 매개변수화된 타입의 배열은 생성가능 new ArrayList<?>[1] //success
instanceof 매개변수화된 타입의 인스턴스인지는 알 수 없다.
하지만, 비경계 와일드 카드인 매개변수화된 타입의 배열은 생성할 수 있다.
instanceof 검사는 런타임에 수행되며 런타임 시에 매개변수화된 타입은 이 타입을 제거한 결과로 교체된다.
public Object passThrough(Object o){
return o;
}
List<String> list2 = new ArrayList<String>();
Object o = w.passThrough(list2);
@SuppressWarnings("unused")
List<String> list1 = (List<String>) o;
List<String> list3 = (List) o;
List<?> list4 = (List<?>) o;
List<?> list5 = (List) o;
'JAVA이야기' 카테고리의 다른 글
[java] 왜 thread의 stop메소드를 deprecated 시켰나? (0) | 2011.07.17 |
---|---|
클래스 확장과 제네릭 타입 (0) | 2011.07.17 |
와일드카드 캡쳐 (0) | 2011.07.17 |
제네릭 메소드 호출과 타입 추정 (0) | 2011.07.16 |
제네릭 타입 (0) | 2011.07.16 |