2016-06-26 4 views
2

:이 작업을 수행 할 수있는 Java에서

protected void makeRequest<T extends BaseJsonClass, T2 extends BaseJsonClass> (Response<T> response, T2 dataToSend, String url) {} 

일부 요청 : 어떻게 C#에서

makeRequest(response, null, serverUrl); 
makeRequest(response, jsonData, serverUrl); 

?

데이터를 null 또는 특정 유형의 개체로 받아 들일 수 있어야하는 메서드를 작성하고 있습니다.

The type arguments for method `BaseModelController.makeRequest<T,T2>(Response<T>, T2, string)' 
cannot be inferred from the usage. Try specifying the type arguments explicitly 

가 어떻게 null의 가능성뿐만 아니라 될 수있는 일반적인 가능합니다 :

/** 
* Make a request to the server. 
* dataToSend can be null. 
* */ 
protected void makeRequest<T, T2>(Response<T> response, T2 dataToSend, string url) where T : JsonObjectBase where T2 : JsonObjectBase 
{ } 

현재 나는 문제 받고 있어요? ** ** 2 EDIT

JsonObjectBase이 연장되기 바로 목적
makeRequest(response, null, serverUrl);
또는
makeRequest(response, someJsonData, serverUrl);

:

는 EDIT 1 ** ** I이 방법과 같이 호출 다른 Json 클래스 그래서 그들은 항상 자동으로 Json 개체가 될 것이라고 자동으로 파싱/직렬화 할 수 있습니다. 다른 코더가 알 수없는 객체를 입력하는 실수를하지 않도록 유형 검사에이 객체를 사용합니다.
null을 전달하는 것은 아무것도하지 않으려 고 가정하는 동일한 값을 정의하는 것보다 훨씬 낫습니다. 매우 지저분 해지기 때문입니다. 전원

ModelControllerAccount.getInstance().createUser(
      username.text, password.text, // Params 
      new Response<JsonUserAccountFeedback>(
       success: (jsonObjectStandardResponse) => Debug.Log("Success when creating account. Data: " + jsonObjectStandardResponse.getAccessToken()), 
       failed: (failedReason) => Debug.Log("Failed to make request. Reason: " + failedReason.getReasonDescription()) 
      ) 
     ); 
+1

이 메소드를 어떻게 호출합니까? – cezarypiatek

+1

null을 원하는 유형으로 변환 해보십시오. –

답변

1

당신은 같은 것을 할 수있는 :

protected void MakeRequest<T>(Response<T> response, JsonObjectBase dataToSend, string url) where T : JsonObjectBase 
    {  
    } 

과 같은 방법 전화 : MakeRequest(response, null, serverUrl);

을 또는 당신도 활용할 수있다 의 선택적 인수 :이 같은

protected void MakeRequest<T>(Response<T> response, string url, JsonObjectBase dataToSend = null) where T : JsonObjectBase 
    { 
    } 

및 통화 방법 : MakeRequest(response, serverUrl);

,
+0

이것은 완벽합니다. –

4

이 다소 API를 변경할 수있는 경우,이 문제를 해결하는 쉬운 방법 중 하나는 두 번째 매개 변수를 생략 과부하를 추가하는 것입니다의

예. 데이터를 보내지 않는 경우 발신자가 더 쉽게 사용할 수 있습니다. 이처럼

:

protected void makeRequest<T>(Response<T> response, string url) where T : JsonObjectBase 
{ 
    makeRequest (response, default(JsonObjectBase), url); 
} 
+0

그런 다음 코드를 반복해야합니까? 과부하라고 말하면 다른 방법을 의미합니까? –

+0

코드를 두 번째 메소드에서 호출하는 두 번째 메소드로 코드를 아웃소싱 할 수 있으므로 코드를 반복하지 않아도됩니다. – chris579

+0

@iLoveUnicorns - 예. 오버로드의 가능한 구현을 보여주기 위해 내 대답을 편집했습니다.이 메소드는 null을 JsonObjectBase로 캐스팅하는 다른 메소드를 간단하게 호출 할 수 있습니다. 호출자의 코드에서도 똑같은 작업을 수행 할 수 있지만 호출자가 IMHO를 사용하면 과부하가 쉽게 느껴집니다. –

1

null의 값은 컴파일러에게 해당 매개 변수의 유형을 말하지 않기 때문에이 발생합니다. 결국, makeRequest의 구현은 T2의 유형을 확인하고 그것이 보는 것에 따라 크게 다른 일을 할 수 있습니다. 예를 들어, List<int> 유형의 변수를 전달한 경우 이 List<int>임을 알 수 있지만 null은 모든 참조 유형의 값일 수 있습니다. 컴파일러가 타입을 알아낼 수 없습니다 (또는 이제까지 잘못된를 결정하는 경우), 당신이 그것을 말할해야하는 경우 :

Response<string> myResponse; 
makeRequest<Response<string>, object>(myResponse, null, "http://example.com"); 

난 그냥 일반 메소드를 호출하는 데 사용되는 유형을 지정했습니다. 이 경우 null 매개 변수의 유형은 object입니다.당신이 가장 가능성에만 JsonObjectBase의 방법에 대한 액세스를 필요로하고 있기 때문에

+0

그럼 모델 컨트롤러를 통해 추상화와 제네릭의 힘을 잃어 버렸습니다. –

+0

@iLoveUnicorns 호출하는 메서드가 제네릭 형식 매개 변수'T'를 사용하면'null' 대신'default (T)'를 전달할 수 있으며 특정 제네릭 호출을 사용할 필요가 없습니다. –

관련 문제