java--泛型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java--泛型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3231字,纯文字阅读大概需要5分钟。
内容图文
##泛型
##一,在具体使用时,可以分为泛型接口、泛型类和泛型方法。
- 1,泛型的好处:
是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。
- 2,在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,
- 3,命名泛型字母可以随意指定,尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2)
常见字母(见名知意)
T Type
K V Key Value
E Element
- 4, 泛型不能使用在静态属性上
##二,泛型类
class Gen<T> {
private T ob; // 定义泛型成员变量
public Gen(T ob) {
this.ob = ob;
}
public T getOb() {
return ob;
}
public void setOb(T ob) {
this.ob = ob;
}
public void showType() {
System.out.println("T的实际类型是: " + ob.getClass().getName());
}
}
Gen<Integer> intOb = new Gen<Integer>(88);
intOb.showType();
int i = intOb.getOb();
Log.e("date","value= " + i);
// 定义泛型类Gen的一个String版本
Gen<String> strOb = new Gen<String>("Hello Gen!");
strOb.showType();
String s = strOb.getOb();
Log.e("date","value= " + s);
- K,V类型
public class ResultMap<K,V> {
private K key;
private V value;
//省略 set ,get 方法
public void put(K key,V value){
this.key=key;
this.value=value;
}
}
- 使用
ResultMap<String,User> resultMap=new ResultMap<>();
resultMap.put("currentUserKey", new User());
##三,泛型方法
public class JsonUtil {
public <T> T str2Json(String jsonText,Class target){
T result=null;
//....parse to json
return result;
}
}
##四,<? extend E> 和<? super E>
- 1,< ? extends E >
1.1,List < ? extends A > 表示 这个list里面存的是A的子类,具体是啥不知道,只知道范围!
那可以设定分两个范围: A子类,A父类。
1.2,对于add:
A子类情况:如果你允许add的元素是A的子类,那么因为泛型参数限定? extends A, 所以ArrayList可以指定的类型也是A的子类,那么无法保证add的对象一定ArrayList指定类型的子类对象,比如: ArrayList指定C, list却add了A()对象–这就是非法的!(因为list并不知道指定了C,它可以确定的范围就是可以add所有A的子类。)所以A子类该范围不行!
A父类情况:ArrayList指定类型肯定实在(?,A]范围内,所以这种情况肯定不行!
1.3,对于get:
list不知道你存入ArrayList是什么类型,但是我可以确定使用A的引用肯定可以接受ArrayList中的元素(无论ArrayList设定什么类型),因为A肯定是里面元素的父类!但是你使用其他类型接受就不行了,因为如果ArrayList的类型是你指定的那个类型的父类,是接受不了的。
- 2,< ? super E >
2.1,List < ? super C > 表示list里面存的是C和其父类,具体是啥不确定,只知道范围。同样的分为:C子类,C父类。(其实应该发现了没必要分为两类,有一类是肯定不行的)。
2.2,add:
C子类:如果允许add,就允许list来add任何C的子类元素,因为ArrayList指定的范围是C和其父类,所以ArrayList可以准确接受该假设范围的所有对象。 所以,C子类这个范围可行,这样就有一个标准的类型判断依据,不像extends,根本无法确定判断标准,编译器就不会知道怎么做。
C父类:显然和上面A子类情况是一样的!因为list无法知道ArrayList指定类型 ,所以无法确定判断标准。
2.3, get:
因为list只允许add C的子子类对象,你或许也在想:那我直接用C不就可以接受ArrayList数据吗?并不是的,ArrayList在赋给list之前可能里面已经有值了,这个值的类型如果是ArrayList指定类型,并且是C的父类,那么C就无法接受! 而且list不知道ArrayList会指定哪个类型,只知道范围,所以无法确定是哪个父类,所以干脆用Object那肯定就能接受了,所以返回的其实只有Object能接受,否则就得强转。
内容总结
以上是互联网集市为您收集整理的java--泛型全部内容,希望文章能够帮你解决java--泛型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。