2012-01-09 4 views
1

기존 코드를 작업하고 있습니다. folowing 구문 나는이 방법을 가지고있는 클래스 중 하나에서 :Java : 메서드를 이해할 수 없습니다. 구문

public Response getData(Request serviceRequest, Class<? extends APIResponse> expectedResponseClass) 
{ 

} 

내 질문은,이 메서드의 두 번째 매개 변수를 이해할 수 없었다.

누군가 제게 말해 주실 수 있습니다. 그 두 번째 매개 변수는 무엇입니까? 어떻게 이해해야합니까?

감사합니다. 개질

우리 수퍼

Superclass.java

public class Superclass {} 

One.java

public class One extends Superclass{} 
을 예상하는 방법에 관한 파라미터로서 또한 서브 클래스를 전달할 수 있다는 증명

Main.java

public class Main { 
    public static void main(String args[]) { 
     One one = new One(); 
     Main main = new Main(); 
     main.mainMethod(one); 
    } 

    public void mainMethod(Superclass sc) { 
     System.out.println("Inside the Main Method"); 
    } 

} 
+0

제네릭이라고합니다. 다음을 읽으십시오. http://docs.oracle.com/javase/tutorial/java/generics/index.html – insumity

답변

1

메서드의 매개 변수 형식이 Class<APIResponse> 인 경우 해당 형식 매개 변수가 APIResponseClass 개체를 나타내며이 개체의 하위 클래스는 없습니다. Class 개체의 형식 매개 변수는 해당 개체가 나타내는 클래스입니다. 즉, 유효한 매개 변수는 APIResponse 클래스 개체 (또는 null)뿐입니다. 반대로

Class<? extends APIResponse>에는 유형 파라미터 APIResponse또는 중 어느 서브 클래스 인 Class 개체를 나타낸다. 즉, 서브 클래스가 APIResponse 인 경우 (나는 MyAPIResponse이라고 부름), 클래스 객체를이 메소드에 전달할 수 있습니다. 해당 객체의 유형은 Class<MyAPIResponse>이며 Class<? extends APIResponse> 안에 들어 있습니다.

이유가 궁금 할 것입니다. Class<MyAPIResponse> 개체를 Class<APIResponse> 변수에 넣을 수없는 이유는 무엇입니까? 그 대답은 Java의 유형 안전을 깨뜨리기 때문입니다. 이것은 즉시 명확하지 않으며, Class으로 설명 할 수는 없습니다 (해당 클래스에는 유형 매개 변수에 따라 매개 변수가있는 메소드가 없습니다). 그래서 대신 다른 일반 클래스를 사용하여 예제를 제공합니다. ArrayList. 여기서 YourAPIResponseAPIResponse의 또 다른 하위 클래스입니다.

ArrayList<APIResponse> list = new ArrayList<MyAPIResponse>(); 
list.add(new YourAPIResponse()); 

ArrayList<MyAPIReponse> 객체가 ArrayList<APIResponse> 변수에 맞지 수 있다면,이 코드는 컴파일하지만 것이 효과가함으로써 자바의 유형 안전을 파괴하는 List<MyAPIResponse>YourAPIResponse 개체를 삽입하는 것입니다. 그리고 그것이 당신이 그렇게 할 수없는 이유입니다.

이것은 분명히 제네릭으로 할 수있는 것에 많은 한계를두고 있습니다. 이 문제를 해결하기 위해 와일드 카드 제네릭이 개발되었습니다.

ArrayList<? extends APIResponse> list = new ArrayList<MyAPIResponse>(); 

을하지만 다음 위에서 두 번째 줄을 추가한다면 컴파일러는 인수의 실행시의 형태는 유형 내부에 맞는지 확인할 수 없기 때문에, 그것은 컴파일되지 것입니다 : 그래서 당신은이 작업을 수행 할 수 있습니다 ArrayList의 매개 변수 따라서 유형 안전이 유지됩니다.

0

이는 Java Generics 매개 변수입니다. 즉, 두 번째 매개 변수는 APIResponse을 확장하는 Class이어야합니다.

+0

대단히 감사합니다.하지만 왜이 방법을 사용합니까 ?? 수퍼 클래스를 직접 두 번째 매개 변수로 직접 사용할 수 있습니까? 이 말도 안되는 모든 구문보다는 – Kiran

+0

너무 엄격합니다. 여러분은'APIResponse'를 확장하고 원하는대로 구현할'클래스'를 만들 수 있습니다. –

+0

두 가지 접근법간에 차이가 없다고 느껴졌을 때 왜 "너무 엄격 할 것"이라는 말을 사용 했습니까? – Kiran

0

두 번째 매개 변수가 APIResponse의 하위 클래스가 될 수 있음을 나타냅니다.

1

두 번째 인수는 APIResponse (또는 APIResponse 그 자체)의 서브 클래스에 해당하는 Class 유형의 인스턴스입니다.

일부 의견에 암시하는 것처럼이 호출에 관련된 APIResponse (또는 하위 클래스)의 인스턴스가 없음에 유의하십시오.

6

Class<? extends APIResponse>바운드 와일드 카드의 예입니다. 이는 유형이 APIResponse 인 클래스이거나 그 서브 클래스 일 수 있음을 의미합니다.

대신 Class<APIResponse>이있는 경우 해당 하위 유형이 아닌 APIResponse 유형의 클래스에서만 메소드를 호출 할 수 있습니다.

자세한 내용은 Wildcards tutorial을 참조하십시오.

+0

위 메소드를 호출 할 수 있다고 추가하겠습니다. 예 : 그런 인수들 : getData (serviceRequest, APIResponse.class) –

+0

고맙습니다. 매우 명확한 설명이었다. – Kiran

+0

필자는이 점에 동의하지 않고 대신 해당 하위 유형이 아닌 APIResponse 유형의 클래스에서만 메소드를 호출 할 수있었습니다. 나는 서브 클래스를 통과 할 수있는 간단한 예제를 시도했다. – Kiran

관련 문제