泛型方法

前面两章我们介绍了泛型类泛型接口,这篇我们来讲解一下什么是泛型方法,其实在讲泛型类的时候我们已经有提到过泛型方法,只是没有去细说。那么什么又是泛型方法呢?泛型方法如何定义?泛型方法和普通方法有什么区别呢?

一、怎么定义一个泛型方法

首先我们来讲一下如何来定义一个泛型方法,他在写法上与普通方法有什么不同

/*

*定义一个泛型方法的语法如下

* 方法作用域修饰符 <泛型类型> 返回值类型 方法名(泛型){

*

* }

*定义泛型方法时的<>尖括号里面的泛型类型可以是泛型列表,中间用“,”号隔开,这一点与泛型接口和泛型类雷同

*/

public <K> K deleteMethod(K value){



return value;

}

public <M> String deleteMethod1(M value){



return "";

}

二、什么是泛型方法

在开发中很多情况下我们在执行一个方法之前并不知到要传递什么类型的参数给这个方法,也不知道方法执行后要返回什么数据类型,泛型方法就是这种情况的解决方案。当然为了好理解我这里只是简单的说明泛型方法的作用,并不代表这就是泛型方法的唯一用途。可能有人会说怎么可能会有这么奇葩的情况出现?什么都知道还怎么开发?那接下来就带大家见识一下这种奇葩情况下如何开发。

做Android开发的同学应该都对接过后台接口,后台接口一般都会返回一个json格式的数据,然后我们解析出数据用来展示。但是很讨厌的是每个接口返回的数据类型都不一样。那么我们如何只写一个网络请求方法,却能够获取到我们想要的各种数据类型呢。答案就是如下使用泛型方法解决

/* @param tClass

* @param <T>

* @return

*/

public <T> T getHttpResponse(Class<T> tClass){

try {

/**

* 通常这里都是使用oKHttp调用后台接口,获取返回的json数据,

* 然后再通过Gson或者FastJson转换成入参的Class类型(我们通常称返回的数据类型为xxBean)

*/

return tClass.newInstance();//这里省去网络接口调用,简单的返回一个对应的Bean结果

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

}

return null;

}

三、泛型方法和普通方法有什么区别

如果有同学能够看出来下面两个方法的区别,那么恭喜你对泛型方法有了一定的认识。至少能够辨识出那些是泛型方法了。

public class GenericClassMethod<K> {



/**这只是一个普通的方法,有同学可能就问了,这个方法不是用使用泛型参数吗,怎么会是普通方法呢?有这*个问题的可以再去看一遍泛型方法的定义语法,它少了一个<>尖括号。虽然这个方法有用到泛型,但是却不是*方法本身的泛型,而是这个泛型类的泛型。而类的泛型在实例化时就已经绑定了一个具体的数据类型,所以这*里的泛型就可以直接看成是一个具体的数据类型了。
*/
public K deleteMethod(K value){



return value;

}

}



/**这就是一个最典型的泛型方法,它内部所使用的是泛型方法本身的泛型,无泛型类无关。

*记得在讲泛型类的时候我们就讲过,泛型类的泛型是不允许在静态域中使用的,如果想在静态域中使用泛型只*能将静态方法变成静态泛型方法。其实在变成静态泛型方法时,它内部所使用的泛型就已经与该方法所在的泛*型类无关了,只与泛型方法本身的泛型关联。
*/
public <K> K deleteMethod(K value){



return value;

}

四、泛型的大招-通配符

前面在讲泛型类的继承关系时,我们说泛型所绑定的数据类型TopBean与BassClass的继承关系不会延续到泛型类中来的,而GenericClass1<TopBean>和GenericClass1<BaseClass>是没有任何继承关系的。所以下面的第一个getData方法传泛型类GenericClass1<TopBean>完全没有问题,但是传GenericClass1<BaseClass>却编译报错了。但有时候我们又希望能够延续这种继承关系怎么办呢?答案是通过指定泛型类的上下界来实现。

我们要怎样才能做到,一个get方法能传GenericClass1<TopBean>和GenericClass1<BaseClass>呢,这里泛型的通配符就是为我们解决这种问题的,

/** 如下方法getData1,就可以帮我们实现既可以传GenericClass1<TopBean>又可以传*GenericClass1<BaseClass>

* @param bClass

* @param <T>

* @return

*/

public <T> String getData(GenericClass1<TopBean> bClass){



return "";

}

/*

*extends替我们指定了泛型类的上界

*通配符将泛型参数的这种继承关系延续到泛型类中来

*/

public String getData1(GenericClass1<? extends BaseClass> bClass){



return "";

}



GenericMethod genericMethod = new GenericMethod();

genericMethod.getData(topBeanGenericClass1);

genericMethod.getData(baseClassGenericClass1);//这里就直接编译错误了



//通过通配符于extends的结合既限制了泛型的上界

genericMethod.getData1(topBeanGenericClass1);

genericMethod.getData1(baseClassGenericClass1);

五、泛型的下界

前面在讲解泛型类时有提到泛型上界是通过extends来指定。那么泛型类的下界如何定义呢?

/**

* 通过通配符和super组合来指定泛型类的下界

* 这里的入参的是个泛型类对象,而这个泛型类所绑定的参数被指定了下界,

* 也就是这个泛型类的泛型参数只能是BaseClass或者是BaseClass的父类

* @param data

*/

public void genericSuper(GenericSuper<? super BaseClass> data){



}



GenericSuper<BaseClass> baseClassGenericSuper = new GenericSuper<>();

GenericSuper<TopBean> beanGenericSuper = new GenericSuper<>();

genericMethod.genericSuper(baseClassGenericSuper);

genericMethod.genericSuper(beanGenericSuper);//入参的泛型类所绑定的参数类型只能是BaseClass自身或是BaseClass的父类,所以这里会编译错误

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值