2013-08-27 2 views
3

T와 Object 유형의 차이점은 무엇입니까?T와 Object 유형의 차이점은 무엇입니까?

다른 말로하면 List<T>List<Object> 사이의 차이점은 무엇입니까?

+0

T = 일반 유형 악기 –

+0

읽기 시작 : http://docs.oracle.com/javase/tutorial/java/generics/ –

답변

6

런타임시 차이점은 없습니다. Java generics는 Type Erasure을 통해 구현되므로 모든 구현에서 동일한 클래스가 사용됩니다.

그러나 컴파일 타임에는 개체를 사용할 때마다 캐스팅하지 않으므로 코드가 훨씬 깔끔 해 보이기 때문에 그 차이는 엄청납니다. 이 컴파일 잘 실행하고

List<Integer> list = new ArrayList<Integer>(); 
list.add(1); 
list.add(2); 
list.add(3); 
for (Integer n : list) { 
    System.out.println(n+5); 
} 

그것은 또한 쉽게 읽을 수 :

이 예를 생각해 보자. 대신 List<Object>을 사용하고자하는 경우, 코드가 깨끗하게 보이지 않아 :

List<Object> list = new ArrayList<Object>(); 
list.add(1); 
list.add(2); 
list.add(3); 
for (Object o : list) { 
    // Now an explicit cast is required 
    Integer n = (Integer)o; 
    System.out.println(n+5); 
} 

는 내부적으로하지만, 두 코드 조각들이 list 개체에 대한 똑같은 구현을 사용합니다.

1

List<T>을 generic이라고하며 따라서 List에 항상 T 유형의 객체가 포함됩니다. 다른 객체는 동일한 유형의 객체를 보장하지 않지만 실제로는 객체임을 알고 있습니다 .

0

List<T>은 제네릭 클래스의 이름입니다. List<Object>은 구체적인 인스턴스입니다. List<T>은 아직 클래스가 아닙니다 (일반 클래스입니다. 구체적인 클래스는 만들 수 있지만 바로 사용할 수있는 클래스는 아닙니다.) List<Object>은 클래스입니다.

+0

이것은 전혀 이해가되지 않습니다. –

0

T는 유형 매개 변수입니다. 이는 다른 어떤 코드가 어떤 타입을 선언 할 수 있다는 것을 의미하며, 그 타입 파라미터를 사용하는 클래스의 코드는 구현시 T를 그 타입으로 대체 할 것임을 의미합니다.

그래서 당신은 당신의 자신의 클래스 푸를 생성하고, FOOS를 포함하는 목록을 선언 할 수

List<Foo> foos = new ArrayList<Foo>(); 

을 컴파일러가 알고 있기 때문에 당신은 캐스트없이

Foo foo = foos.get(0); 

같은 메서드를 호출 할 수 있습니다 이리스트는 foos 오브젝트의 get 메소드에 대한 메소드 리턴 유형에서 T를 Foo로 대체합니다.

관련 문제