2014-06-09 3 views
-4

다음 메서드는 generic이지만 유용성이 무엇인지 알고 싶습니다. <T>?은 정적이면서 무효화되기 전의 <T>입니다. 내 방법으로 쓰지 않으면 어떻게 될까?일반 메서드 <T> Java에서

public static <T> void nameMethod(BinaryTreeNode<T> t){ 
    /*do something 
     . 
     . 
    */ 
} 

고맙습니다.

+1

왜 보지 않으시겠습니까? – awksp

+1

은 메소드가 generic이라는 객체가 될 수 있도록합니다. 즉, 모든 유형의 객체를 반환 할 수 있습니다. 자바 제네릭에 대한 자습서로 의심의 여지가 없어 질 것입니다. – vikeng21

+0

어떤 경우에는 코드가 컴파일되지 않지만 그 이유를 알 수는 없습니다. 단지 작성해야한다는 것을 알고 있지만 이유를 알고 싶습니다. – user3721105

답변

2

<T>은 메소드의 전체 컨텍스트에 대한 유형 매개 변수를 정의합니다. 지금까지 내가 말할 수있는 건,이 특별한 경우에, 그것은 참으로 그러나

public static void nameMethod(BinaryTreeNode<?> t) { 

에 해당 될 것입니다, 당신은 유형 T을 반환하는 경우, 또는 같은 일반적인 유형의 하나 개 이상의 매개 변수가있는 경우, 형식 매개 변수를 선언하여 컴파일러에서 형식을 식별하는 참조 점을 갖도록해야합니다. 예를 들어 :

public static <T> List<T> mergeSort(List<T> l1, List<T> l2) { 
    //... 
} 

<T> 매개 변수는 List이 동일한 제네릭 형식이어야합니다 반환 모두 List들뿐만 아니라 전달되는 컴파일러를 알려줍니다.

우리가 T에 대한 추가 정보를 선언 할 때 더욱 유용

public static <T extends Number> List<T> asList(T... numbers) { 
    //build list with Number-specific logic... 
} 

편집 : 나는 나의 첫 번째 점에 대해 잘못되었습니다. 추가 매개 변수 나 반환 유형을 사용하지 않아도 <T>을 선언하는 데 사용할 수 있습니다. List을 사용하여 간단한 예제를 제공합니다. 이후 BinaryTreeNode에 익숙하지 않습니다. 우리는 형식 매개 변수를 제거하고 List<?>과 같은 매개 변수를 선언한다면

public static <T> void duplicateFirstElement(List<T> l) { 
    T elm = l.get(0); 
    l.add(elm); 
} 

는리스트와 상호 작용하면서 제네릭 형식을 유지하는 방법이 없습니다.