Java_泛型

泛型

定义类、接口、方法时、同时声明了一个或多个类型变量(如:)称为泛型类、泛型接口、泛型方法、他们统称为泛型。

   
  public class Test1{
       public static void main(String []args)
       {
          // 目标:认识泛型
          ArrayList list = new ArrayList();
          list.add("java1");
          list.add("java2");
          list.add("java3");
          list.add("java4");
          //list.add(new Cat());利用强制类型转换
         for(int i=0;i<list.size();i++)
         {
             String e = (String) list.get(i);
             System.out.println(e);
         }     


        System.out.println("-------------------------------");
             ArrayList<String> list1 = new ArrayList<String> ();
             ArrayList<String> list1 = new ArrayList<>();//JDK 1.7开始,后面的数据类型可以不声明
             list1.add("java1");
             list1.add("java2");
             list1.add("java3");
             //list1.add(new Cat()); //报错格式不符
             for(int i=0;i<list.size();i++)
             {
                String e = list1.get(i);
                System.out.println(e);
             }
             
       }
  }
  class Cat{
  }
  

作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。

泛型的本质 :把具体的数据类型作为参数传给类型变量。

自定义泛型类 、自定义泛型接口、自定义泛型方法

泛型类

 修饰符 class 类名<类型变量,类型变量,...>{
 }

public class ArrayList<E>{
...
}

    
    public class Test{
        public static void main(String []args)
        {
             //目标:掌握泛型类的定义和使用。
             MyArrayList list = new MyArrayList<>();
             list.add("java1");
             list.add("java2");
             list.add("java3");
             String ele = list.get(1);
             System.out.println(ele);

       MyClass2<Cat,String > c2  = new MyClass2<>();
             
        }
    }

   
   public class MyArrayList<E>
   {
     private Object [] arr = new Object[10];
     private int size;//记录当前位置
     
       public boolean add(E e)
       {
         arr[size++] = e;
        return true;
        
       }
       public E get(int index)
       {
          return reutrn (E) arr[index];
       }
   }

   泛型类的 两种类型
   public class MyClass2<E,T>
   {
     public void put(E e,T t)
     {
     
     }
   }

    public class MyClass3<E extends Animal>{

     }

泛型接口

 修饰符interface  接口名<类型变量,类型变量,..> {
 
 }
 public interface A <E>{
 ...
 
 }  
 

注意:类型变量建议用大写字母,常用的有:E、T、K、V 等


  public class Test{
     public static void main(String []args)
     {
        //目标:掌握泛型接口的定义和使用。
        //场景:系统需要处理学生和老师的数据,需要提供两个功能:保存对象和查询功能。
        
     }
  }
//泛型接口
public  interface Data<T>
{
    void add(T t);
    ArrayList<T>  getByName(String name);
    
     }

public class StudentData implements Data<Student>
{
   @Override 
   public void add(Student student)
   {
   
   }
   @Override
   public ArrayList<Student> getByName(String name)
   {
     return null;
     
   }
}

泛型方法、泛型通配符、上下限

   修饰符 <类型变量,类型变量,...> 返回值类型 方法名 (形参列表){
   
   }
   //示例
   public static void test(T t){
   
   }
   public class Test{
     public static void main(String []args)
     {
         //目标:掌握泛型方法的定义和使用
         String rs= test("java");
         System.out.println(rs);
         
         Dog d = test(new Dog());
         System.out.println(d);

    //需求:所有的汽车可以一起参加比赛。
    ArrayList<Car> cars = new ArrayList<>();
    cars.add(new BMW());
    cars.add(new BENZ());
    go1(cars);

     ArrayList<BMW> bmws = new ArrayList<>();
     bmws.add(new BMW());
     bmws.add(new BMW());
     bmws.add(new BMW());
     go1(bmws);

     ArrayList<BENZ> benzs = new ArrayList<>();
     benzs.add(new BENZ());
     benzs.add(new BENZ());
     go1(benzs);
    
     }
     public static void go(ArrayList<Cat> cars)
     {
        
     }
   }
//泛型方法
public static <T> test(T t)
{
   return t;
}
//定义泛型参数
public static <T extends Car> void go1(T t)
{
   return t;
}
//?通配符,在使用泛型的时候可以代表一切类型 ?extends Car(上限) super(下限)
public static void go(ArrayList<? extends Car> cars)
{

}

public static void go(ArrayList<? super Car> cars)
{

}

泛型的注意事项:擦除问题、基本数据类型问题

泛型是工作在编译阶段的,一旦程序编译成class 文件,class文件中就不存在泛型了,这就是泛型擦除。

泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。

    public class  Test{
        public static void main(String []args)
        {
             //目标:理解泛型的注意事项。
             //1、泛型是工作在编译阶段的,一旦程序编译成class文件,class文件就不存在泛型了,这就是泛型擦除。
             ArrayList<String> list = new ArrayList<>();
             list.add("java1");
             list.add("java2");
             list.add("java3");
             String rs = list.get(2);
             System.out.println(rs);
//2.泛型不支持基本数据类型,只能支持对象类型(引用数据 类型)。
   //ArrayList<int> list2 = new ArrayList<>();
   //ArrayList<double> list1 = new ArrayList<>();
   ArrayList<Integer> list1 = new ArrayList<>();

   list1.add(12);

   ArrayList<double> list2 = new ArrayList<>();
   list2.add(23.3);
    
     
        }
    }
    

在这里插入图片描述

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值