Android中泛型的应用(一)

背景
之前我们知道泛型在Java中意味着什么特性,但貌似在项目中很少应用到它,如果应用恰当,能够减少许多冗余的代码,也能让你的代码变得更加安全。下面会通过解析服务端返回来的json格式数据来讲解它的作用。

再次科普
泛型可以解决数据类型的安全问题,它的主要原理是:在类声明的时候通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。就像下面这个类:

class Person<K,V>{
     private K key ;
     private V value ;
     
     //省略set和get ...
};

好处是在声明对象时,可以指定K和V的类型,表现得更为灵活:

Person<String,Integer> t = null ;          
t = new Person<String,Integer>() ;
t.setKey("刘德华") ;
t.setValue(40) ;

如果在声明类对象的时候,没有指定类型,系统会会自动将类中的“T”都换成“Object”,编译程序的时候会发出警告。

没有使用泛型时
Android开发中服务端传来一个json格式的列表数据,比如商品列表,我们可以使用Gson/FastJson进行解析,下面使用Gson解析:

Gson gson=new GsonBuilder().serializeNulls().create();
GoodsListEntity entity = gson.fromJson(response, GoodsListEntity.class);
List<GoodsItem> list=entity.getData().getList();

对于上面的GoodsListEntity我们是这么定义的:

public class BaseEntity {
    private int errcode;
    private String errmsg;

    //省略set和get ...
}
public class GoodsListEntity extends BaseEntity {

    private Data data;

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    public class Data {
        private String total;
        private String hasnext;
        private String count;
        private String page;
        private String totalPages;
        private List<GoodsItem> list;

        //省略set和get ...

        private class GoodsItem {
            private String productName;

            //省略set和get ...
        }
    }
}

就是这样定义GoodsListEntity,我们完成了解析,但是这样写实体类并不够通用,因为如果此时传来的不是商品列表,而是客户列表或订单列表,那么我们又要重复写一次:

public class GoodsListEntity extends BaseEntity {

    private Data data;

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    public class Data {
        private String total;
        private String hasnext;
        private String count;
        private String page;
        private String totalPages;
        private List<OrderItem> list;

        //省略set和get ...

        private class OrderItem {
            private String orderId;

            //省略set和get ...
        }
    }
}

那会让代码显得很冗余,这个时候就需要用到泛型的知识。

使用泛型后
定义一个网络返回基础类BaseEntity,里面的data我们不知道会传回来什么类型的数据,有可能只包含一个token,或是一个array,所以我们将其定义为T,让使用它的人去定义data的类型,代码如下:

/**
 * 网络返回基础类
 * @param <T>
 */
public class BaseEntity<T> {

    private int errcode;
    private String errmsg;
    private T data;

    //省略set和get ...
}
public class GoodsItem {

    private String productName;

    //省略set和get ...

有些数据是列表结构,因此我们还需要定义一个ListEntity:

/**
 * 网络返回列表基础类
 * @param <T>
 */
public class ListEntity<T> {

    private String total;
    private String hasnext;
    private String count;
    private String page;
    private String totalPages;
    private List<T> list;

    //省略set和get ...

}

这样,我们就把一些通用的Entity代码集合了起来,后面要解析订单列表、客户列表,我们只需要定义一个OrderItem和CustomerItem的实体类,这极大地减少了冗余的代码:

/**
 * 商品列表项
 */
public class GoodsItem {

    private String productName;
    
    //省略set和get ...
}

使用了泛型后,原来Gson的解析已经不适用,为什么?我们回到最初的解析看看:

GoodsListEntity entity = gson.fromJson(response, GoodsListEntity.class);

fromJson的第二个参数应该为GoodsListEntity的类型,那么我们现在的代码如果这么写:

BaseEntity<ListEntity<GoodsItem>> entity=gson.fromJson(response,GoodsItem.class)

这样很显然第二个参数是错误的,我们希望传入以下这类的类型

BaseEntity<ListEntity<GoodsItem>>

请听下回分解

该怎么传入该泛型的类型呢?请参考下一篇文章:《Java基础--Android中泛型的应用(二)》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容