2010-07-05 3 views
0

원격 서버에서 Json String을 검색하고 필요한 형식으로 변환하는 다음 C# 도우미 클래스가 있습니다.이 일반 메서드 호출을 C#에서 Java로 변환하는 방법

public class JsonHelper 
{ 
    private JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    public T GetValue<T>(string methodName, object param) where T : IConvertible 
    { 
     string result = GetJsonString(methodName, param); 
     return (T)Convert.ChangeType(obj, typeof(T)); 
    } 

    public T GetObject<T>(string methodName, object param) where T : new() 
    { 
     var result = GetValue<string>(methodName, param); 
     return serializer.Deserialize<T>(result); 
    } 
} 

-

// Usage: 
bool value1 = GetValue<bool>(methodName, param); 
int value2 = GetValue<int>(methodName, param); 
double value3 = GetValue<double>(methodName, param); 
User user = GetObject<User>(methodName, param); 
List<User> users = GetObject<List<User>>(methodName, param); 

는 지금은 자바 programm에있는 동일한 기능을 갖고 싶어. 지금 당장 붙어있는 두 가지 점이 있습니다 :

  • 이 메서드가 올바르게 호출됩니까?

    public <T> T SendJsonPrimitiveRequest(String methodName, Object param) 
        { 
         return null; 
        } 
    

어떻게에만 문자열에서 주조 될 수 타입의 매개 변수를 허용에 나는이 일반적인 방법을 제한 할.

  • GetValue는 Convert.ChangeType (...)을 사용하여 C#에서 훌륭하게 작동하는 int, double, bool 및 string 값을 검색하는 데 사용해야합니다. Java에서이 작업을 수행 할 수 있습니까? 아니면 GetBool(), GetInt(), ... 등의 메서드를 작성해야합니까?

답변

3

불행히도 Java는 문자열 변환을 설명하는 기본 제공 인터페이스가 없습니다. 가장 가까운 것은 일부 객체가 생성자에서 String을 가져 오거나 valueOf (String) 정적 메서드를 가짐을 의미합니다. 이 기능을 선언 할 인터페이스가 없기 때문에 제네릭을 사용하여 유형을 문자열로 구성 할 수있는 객체로 제한 할 수 없습니다.

상자 형식의 제네릭을 사용하여 단일 GetValue 메서드를 제공 할 수 있지만 검색하려는 형식의 해당 클래스를 전달해야합니다.

T <T> getValue(String methodName, Object param, Class<T> type) 

아주 예쁜 아니, 그것은) (,) getBool을 별도의 getInt를 (만들 (필요 없음 복싱에보다 효율적으로), 일반적으로 문자열에서 객체를 생성하는 좋은 방법의 부족으로 아마 간단 결합 행동 양식.

+0

GetBool(), GetInt() ...와 비 제네릭 방식을 사용했습니다. 아마도 성능면에서 가장 좋은 선택 일 것입니다. 그러나 추가 클래스 매개 변수가있는 트릭은 언제든지 유용 할 수 있습니다. –

2

메소드 내에서 T을 찾을 수 없기 때문에 Java 메소드에 도움이 필요합니다. 적절한 변환을 수행하기 위해 실행 시간에 clazz 볼 수 있습니다

public <T> T sendJsonPrimitiveRequest(String methodName, 
             Object param, 
             Class<T> clazz) 

그런 식으로이 일을 일반적인 방법은 추가 매개 변수를하는 것입니다. 다른 질문

:

  • 아니, 당신은
  • 하는 당신은 할 수 없습니다 (중 C# 또는 자바) 문자열에서 변환 할 수있는 유형의 유형 매개 변수를 제한 할 수 없습니다

    int x = sendJsonPrimitiveRequest("foo", param, Integer.class); 
    
  • 내가 Convert.ChangeType에 대한 직접 해당 알고하지 않는 일부 콩 관련 lib 디렉토리가있을 수 있지만 : 당신이 자동 언 박싱을 사용할 수 있지만, 형식 인수로 원시 타입을 사용 랠리가 도움이 될 수 있습니다. 사실 Spring's 변환 라이브러리가 일반적으로 유용 할 수 있습니다.

나는 mdma의 전반적인 평결에 동의합니다. 아주 특별한 경우에는 몇 가지 방법이 더 간단 할 수 있습니다. Java generics가 당신을 돕는 것 이상으로 당신을 도울 것입니다, 나는 의심한다.

관련 문제