2015-01-13 2 views
0

Я пытаюсь передать Java-класс в качестве параметра в функции, потому что у меня есть несколько классов pojo для разных API-интерфейсов, и я пытаюсь создать единую утилиту парсера для всего URL-адреса API и класс pojo, я пробовал с небольшим или никаким успехом.Передача класса как параметра в java-функцию

ниже приведен пример кода -

public class util { 

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 
     List<JsonGenMovies> jsongen = null; 
     String url = "http://www.dishanywhere.com/radish/v20/dol/movies/carousels/featured.json?nkey=0e1345ee597cf280c8a2cde367b6b894"; 
     getMovieParser(jsongen, url); 

     List<JsonGenShow> jsongenShow = null; 
     String URL = "http://www.dishanywhere.com/radish/v20/dol/shows/carousels/featured.json"; 
     getShowParser(jsongenShow, URL); 
    } 

    public static String[] getMovieParser (List<JsonGenMovies> jsongen, String url) throws JsonParseException, JsonMappingException, IOException 
    { 
     URL jsonUrl = new URL(url); 
     ObjectMapper objmapper = new ObjectMapper(); 
     jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGenMovies>>() {}); 
     String[] shows = new String [jsongen.size()]; 
     int i = 0; 
     for(JsonGenMovies element : jsongen) { 
      shows[i++]=element.getName(); 
     } 
     for(int j =0; j<shows.length;j++) 
     { 
      System.out.println(shows[j]); 
     } 
     return shows; 
    } 

    public static String[] getShowParser (List<JsonGen> jsongenShow, String URL) throws JsonParseException, JsonMappingException, IOException 
    { 
     URL jsonUrl = new URL(URL); 
     ObjectMapper objmapper = new ObjectMapper(); 
     jsongenShow = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGen>>() {}); 
     String[] shows = new String [jsongenShow.size()]; 
     int i = 0; 
     for(JsonGen element : jsongenShow) { 
      shows[i++]=element.getName(); 
     } 
     for(int j =0; j<shows.length;j++) 
     { 
      System.out.println(shows[j]); 
     } 
     return shows; 
    } 
} 

в строке -

jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<JsonGen>>() {}); 

Я до сих пор <List<JsonGen>> жесткий закодировано имя класса, который я пытаюсь заменить аргументами. пожалуйста, если вы можете помочь.

Пожалуйста, ответьте небольшим пояснением, один вкладыш может быть не моим.

С уважением Шек

+0

Вы можете уточнить _replace с arguments_? –

+0

Извините за любую путаницу, замените аргументы, переданные при вызове функции, так что здесь getParser (jsongen, URL); Я передаю экземпляр «Список jsongen», я хочу заменить <Список > тоже с параметром. – Shek

+0

Я до сих пор не понимаю. –

ответ

2

Если я правильно понял вы хотите иметь одну функцию, а не двух или более.
Вы можете сделать это с generic type

Например

public static <T> String[] getParser(List<T> jsongen, String url) throws JsonParseException, JsonMappingException, IOException { 
    URL jsonUrl = new URL(url); 
    ObjectMapper objmapper = new ObjectMapper(); 
    jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<T>>() { 
    }); 

    String[] shows = new String[jsongen.size()]; 
    int i = 0; 
    for (T element : jsongen) { 
    shows[i++] = element.getName(); 
    } 

    for (int j = 0; j < shows.length; j++) { 
    System.out.println(shows[j]); 
    } 
    return shows; 
} 

Если оба JsonGenMovies и JsonGen расширяет/реализует интерфейс или класс, например JsonGenMovies extends Json, то вы можете сделать это:

public static <T extends Json> String[] getParser(List<T> jsongen, String url) 

T является общий тип, он действительно не существует, но он будет заменен во время выполнения классом, используемым для jsongen arg.

Например в:

List<String> myList; 
getParser(myList, "http://blablabla.blalb.com"); 

Все T заменяются String.

Надеюсь, это то, что вы ищете.
вы можете найти больше объяснений об общем типе here с лучшим объяснением, чем мое.

EDIT:

Если вы хотите сохранить шаблон POJO, то вы можете попробовать это (не уверен, что это работает)

public static String[] getParser(List<?> jsongen, String url) throws Exception { 
    URL jsonUrl = new URL(url); 
    ObjectMapper objmapper = new ObjectMapper(); 
    jsongen = objmapper.readValue(jsonUrl, new TypeReference<List<?>>() { 
    }); 
    String[] shows = new String[jsongen.size()]; 
    int i = 0; 
    for (Object element : jsongen) { 
    Method method = element.getClass().getMethod("getName"); 
    shows[i++] = (String) method.invoke(element); 
    } 

    for (int j = 0; j < shows.length; j++) { 
    System.out.println(shows[j]); 
    } 

    return shows; 
} 
+0

Я как раз собирался написать в основном то же самое. Я думаю, что это то, что ищет OP. – wolfcastle

+0

@ Duffydake Спасибо, он показывает ошибку на 'code'shows [i ++] = element.getName(); и подразумевая, что нужно добавить бросок. для его решения я должен был сделать это 'code'if (элемент instanceof JsonGenMovies) { \t \t \t \t JsonGenMovies jgm = (JsonGenMovies) элемент; \t \t \t \t показывает [i ++] = jgm.getName(); что снова делает его функцией класса. : '( – Shek

+0

@Shek, как я сказал, чтобы иметь возможность вызвать getName(), все классы должны иметь эту функцию, и для этого вы можете создать абстрактный класс, класс или интерфейс, расширяет/реализует класс/интерфейс в обоих ваших объектов, а затем публичные static ... – Duffydake

Смежные вопросы