java基础:浅谈泛型

1.为什么要使用泛型

给一段代码:

import java.util.ArrayList;
import java.util.List;

public class GenericList {
    //error
    public static void main(String[]args){
        List strList=new ArrayList<>();
        strList.add("str1");
        strList.add("str2");
        strList.add(10);
        strList.forEach(str->System.out.println(((String)str).length()));
    }


}

运行结果:在这里创建了一个List集合,并且希望在内部状态String值,但是,由于误操作而装载了Integer对象,所以程序会进行报错。

说明:在Java的集合中,有一个缺点,把一个对象放入集合中后,集合就会“忘记”这个对象的数据类型,当再次取出对象时,该对象的编译类型就变成了Object型。同时,在取出集合元素的时候还需要进行强制的类型转换,增加了编程的复杂度。

 

2.使用了泛型后:

import java.util.ArrayList;
import java.util.List;

public class GenericList {
    //error
    public static void main(String[]args){
        
        List strList=new ArrayList<String>();
        strList.add("str1");
        strList.add("str2");
        strList.add(10);
        strList.forEach(str->System.out.println(((String)str).length()));
    }


}

优点:

1.指定strList中只能放置String类型(List<String>)

2.无需进行参数类型转换,因为集合会“记住”保存在其中的类型为String类型

 

3.Java7泛型的“菱形”语法

在java7以前,如果使用带泛型的接口,调用构造器创建对象时构造器的后面也必须带上泛型。

  List<String> strList=new ArrayList<String>();

但是在java7之后,构造器后只需要给出一对尖括号即可<>,java可以推断尖括号里应该是什么泛型信息,形象的称为“菱形语法”

   List<String> strList=new ArrayList<>();

4.如何自定义带泛型声明的类?

举个栗子:

import java.util.List;

/**
 * 类型固定
 * */
public class Apple<T> {
    private T info;
    public Apple(){}
    public Apple(T info){
        this.info=info;
    }
    public void setInfo(T info){
        this.info=info;
    }
    public T getInfo(){
        return info;
    }
    public void showInfoDetails(){
        System.out.println(this.info);
    }
    public static void main(String[]args){
        Apple<String> a1=new Apple<>("苹果");
        a1.showInfoDetails();
        Apple<Double>a2=new Apple<>(1.22);
        a2.showInfoDetails();
    }


}

 

使用Apple<T>可以生成多个如Apple<String>,Apple<Double>,..等多个逻辑子类

注:当创建了带泛型声明的接口或者父类后,可以为该接口实现类,但是,父类中不能再去包含形参

//error
public class A extends Apple<T>

//right
public class A extends Apple<String>

注:不管为泛型的类型形参传入哪一种类型实参,对于java而言都被当做一个类去处理,在内存中也只会占用一块空间

List<String>l1=new ArrayList<>();

List<Integer>l2=new ArrayList<>();

System.out.println(l1.getClass()==l2.getClass());
//true
//虽然传入的是不同的泛型实参,但是指向的依旧是同一个空间

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值