Java基础之泛型
来源:互联网 发布:c语言冒泡排序 编辑:程序博客网 时间:2024/05/23 23:39
1.什么是泛型
泛型是Java SE 1.5的新特性,泛型的本质是“参数化类型”。简单的来说就是用一个变量来表示类型,这个变量的类型必须是对象类型如:Integer,String,并且不能是基本数据类型如;int ,double,long.,泛型的参数可以用任意字母表示,我们一般用的是T
常见的写法:
类的泛型:
public class demo<T>(){ private T data demo(T data){ this.data=data }}
方法的泛型
//修饰符+方法类型+<参数类型列表>+返回值+方法名字(参数)public static <V> V count(V data){ return(V)(数据)}
2.为什么要 用泛型
通俗来说就是提高了代码的安全性,让错误能够在编译时期检查出来。这里我分别写了两个类 一个是我们普通的类, 一个是定义了泛型的类。先看普通类:
//很简单传入一个object的对象 然后把他赋值,最后用getMdata得到值public class NoFan { private Object mdata; public NoFan(Object mdata) { this.mdata=mdata; } public Object getMdata() { return mdata; }}
//在main函数中调用,这里我给NoFan赋值了123 并(int) a2.getMdata() 打印出来。发现能打印出来public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NoFan a2 = new NoFan(123); Log.e( "onCreate:a2 ", (int) a2.getMdata()+"");
下面 在main函数中调用,这里我给NoFan赋值了123 并(Stirng) a2.getMdata(),并强转类型换成了String 打印. 注意 这里就是问题了。我们发现编译器并没有报错,按理说我们把一个int类型转换为了String应该报错的,但是这里并没有。 接着我们运行程序,报了 Caused by: java.lang.ClassCastException:类转换异常错误。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NoFan a2 = new NoFan(123); Log.e( "onCreate:a2 ", (Stirng) a2.getMdata()+"");
通过泛型我们就能很好的解决这一问题,使用了泛型 相当于就规定了 这个类里面必须要用这个数据类型。这样就使得我们能够在编译器就检查出问题。下面是使用泛型做刚才的例子:
public class Fan<T> { private T mdata; public Fan(T mdata) { this.mdata=mdata; } public T getMdata() { return mdata; }}
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //这里我们规定传入的数据必须是int类型,下面的结果也就不用强制转换了 NoFan<integer> a2 = new NoFan<>(123); Log.e( "onCreate:a2 ", a2.getMdata()+"");
3.泛型的通配符
//这里写的是伪代码。 在Average类里面有一个count求和方法。比较两个对象average1和average2的和, 如过和相等就返回turn,不相等就返回false。 这里的?就是通配符,为什么要用了?因为average2可能和average1的T是不一样的类型。所以就用通配符代替。
public class Average<T> { public boolean Bijiao(Average<?> average2){ if(average1.count==average2.count){ return turn; }else{ return false; } }}
4.泛型的边界值
//这里我们通过extends规定了 T 这个泛型 只能是Number的子类或者是Number.public Class<T extends Number> Demo{}
5.泛型的继承关系
1.父类是泛型,子类必须是泛型并带着父类的参数
//子类的参数必须包含父类的参数,可以有多个public class son<T,V,W> extends father<T>{}
2.父类不是泛型,子类是泛型
public class son<T> extends father{}
- Java基础之泛型
- java基础之泛型
- java泛型之基础
- Java基础之泛型
- Java基础之泛型
- Java基础之泛型
- JAVA基础之泛型
- Java之泛型基础
- java基础之泛型
- java基础之泛型
- java基础之泛型
- Java基础之泛型
- java基础之泛型
- Java基础之泛型
- Java基础之泛型
- Java基础之泛型
- Java基础之泛型
- Java基础之泛型
- 如何辨别思维导图与概念图
- (Ryan的Redis系列博客)6.更改和查询键空间
- 含可变形参函数(initialize_list形参、可变参数模板)
- 使用ajax提交带有file的表单,添加完/jquery.min.js、jquery-migrate-1.1.0.js、jquery.form.js后仍然报错
- Vue.js基础使用教程
- Java基础之泛型
- Windows驱动开发调试工具
- 《数据结构》严蔚敏版(java解)——第三章 栈和队列03 顺序队列操作
- prtobuf 优缺点总结
- 15.5 视图和视图解析器
- ****沙箱与宿主机交互信息过程****
- Android独有的序列化Parcelable
- 20170215.视觉SLAM漫谈(转载)
- 2017/2/15 问题合集