2013-12-20 5 views
6
나는이 같은 방법을 가지고

,<T> T와 T의 차이점은 무엇입니까?

public <T> T doSomething(Class<T> T) { 
return T.newInstance(); 
} 

I

public T doSomething(Class<T> T) { 
return T.newInstance(); 
} 

이 두 사이에 어떤 차이가 있나요,이 같은 동일 할도 할 수 있습니까? T.newInstance()를 무시하십시오. 기본적으로 어떻게 든 T의 새 인스턴스를 만들고 반환 할 것입니다.

덕분에, 샘 첫 번째 예에서

답변

3

, 당신은 자신의 형식 매개 변수 <T>와 일반적인 방법 doSomething을 선언합니다. 클래스가 generic 클래스 인 경우이 <T>은 클래스에있을 수있는 모든 유형 매개 변수와 별도입니다 (심지어 <T>!).

두 번째 예에서는 doSomething에 제네릭 형식 매개 변수를 선언하지 않습니다. 클래스가 <T>을 정의하면이 메서드는 단순히이 메서드를 사용합니다. 그렇지 않으면 T은 인식 할 수 없으며 컴파일러 오류가 발생합니다.

8

<T> TT의 차이점은 무엇입니까?

<T> T은 없습니다. <T>은 반환 형식의 일부가 아닙니다. 이것은 유형 매개 변수를 나타내는 별도의 것입니다. (당신은 또한 public <T> void ...을 가질 수 있습니다.) 버전에서

<T>와 함께, 당신은 형식 매개 변수를 참조하는 방법의 유형 매개 변수 및 인수에 T 및 반환 형으로 T을 선언하고 있습니다. <T>없는 버전에서

, 당신은 방법의 유형 매개 변수로 T를 선언 하지은, 그래서 그것은 대부분 포함하는 클래스의 형식 매개 변수 또는 다른 포함하는 범위입니다. (또는 다른 사람이 실제 클래스 또는 인터페이스 이름을 T로 지정했을 수 있습니다.이 경우 대화 상대에게 알려야합니다.)

두 버전이 모두 컴파일되면 두 번째 버전이 원하는 버전 일 수 있습니다. 클래스의 유형 매개 변수 T을 사용하는 것입니다. 숨기는 새 매개 변수를 추가하는 것이 아닙니다. 클래스의 유형 매개 변수와 관련없는 새로운 유형 매개 변수가 실제로 필요한 경우에는 혼란을 피하기 위해 새 이름을 사용해야합니다.

+0

'class T { T T (T T) {return T; }}' – ZhongYu

+0

@ zhong.j.yu 당신의 요점 은요? – EJP

0

두 번째 옵션은 T가 클래스 제네릭 유형으로 선언 된 경우에만 작동합니다 . 클래스가 제네릭 형식을 정의하지 않고 해당 멤버 함수 만 제네릭 형식을 수락하거나 반환하면 함수 선언에 명시 적으로 선언해야합니다.