有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将多个方法组合成一个通用方法

如果我有很多这样的方法,有没有一种方法可以优化它,使它成为一个单一的函数

或者有其他更好的选择,我可以让它更通用

public List<Address> getAddressList(String response) {
    List<Address> AddressList = new ArrayList<Address>();
    if (response != null && response.length() > 0) {
        try {
            Gson gson = new Gson();
            Type collectionType = new TypeToken<List<Address>>(){}.getType();
            AddressList = gson.fromJson(response, collectionType);              
        } catch (IllegalStateException ex) {
        } catch (Exception ex) {
        }
    }
    return AddressList;
}

public List<Tweet> getTweetList(String response) {
    List<Tweet> tweetList = new ArrayList<Tweet>();
    if (response != null && response.length() > 0) {
        try {
            Gson gson = new Gson();
            Type collectionType = new TypeToken<List<Tweet>>(){}.getType();
            tweetList = gson.fromJson(response, collectionType);                
        } catch (IllegalStateException ex) {
        } catch (Exception ex) {
        }
    }
    return tweetList;
} 

共 (1) 个答案

  1. # 1 楼答案

    要从this here question复制axtavt的答案,请执行以下操作:


    如果不将T(作为Class<T>)的实际类型传递给您的方法,则无法执行此操作

    但是如果显式地传递它,您可以为List<T>创建一个TypeToken,如下所示:

    private <T> List<T> GetListFromFile(String filename, Class<T> elementType) {
        ...
        TypeToken<List<T>> token = new TypeToken<List<T>>() {}
            .where(new TypeParameter<T>() {}, elementType);
        List<T> something = gson.fromJson(data, token);
        ...
    }
    

    另请参见:


    所以,为了回答你的问题,你可以这样做:

    public List<Address> getAddressList(final String response) {
        return getGenericList(response, Address.class);
    }
    
    public List<Tweet> getTweetList(final String response) {
        return getGenericList(response, Tweet.class);
    }
    
    @SuppressWarnings("serial")
    private <T> List<T> getGenericList(final String response, final Class<T> elementType) {
        List<T> list = new ArrayList<T>();
        if (response != null && response.length() > 0) {
            try {
                final Gson gson = new Gson();
                final Type collectionType = 
                        new TypeToken<List<T>>(){}.where(new TypeParameter<T>() {}, elementType).getType();
                list = gson.fromJson(response, collectionType);
            }
            catch (final IllegalStateException ex) {
            }
            catch (final Exception ex) {
            }
        }
        return list;
    }
    

    编辑:尝试执行代码

    我通过以下小测试尝试了这段代码,该测试只需创建一个包含几个地址的列表:

    public static void main(final String[] args) {
        final List<Address> addressList = getAddressList("[{}, {}]");
        System.out.println(addressList);
    }
    

    结果是:

    [gson.Address@6037fb1e, gson.Address@7b479feb]

    我在测试项目中创建了自己的Address类,因此使用了gson。上述输出中的地址