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{}
0 0
原创粉丝点击