Java基础之泛型

本文介绍了Java泛型的基础概念,包括泛型的定义、使用原因、通配符的应用、边界值设定及继承关系等内容。通过实例对比了使用泛型前后代码安全性上的显著提升。

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{
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值