JAVA基础 day15 JAVA泛型的使用

泛型:JDK1.5版本后出现的新特性。用于解决安全问题,是一个安全机制。
泛型格式:通过<>来定义要操作的引用数据类型

泛型在集合框架中很常用,带<>的都可以使用泛型。泛型可以避免强转问题。

例子
import java.util.*;
class GenericityDemo
{
      public static void main(String []args)
      {
          ArrayList<String> al=new ArrayList<String>();
          al.add("asd");
          al.add("sdf");
          al.add("vbv");

          Iterator<String> i=al.iterator();//因为是取迭代器中的元素,所以迭代器也要进行泛型修饰
          while (i.hasNext())
          {
              String s=i.next();
              System.out.println(s);
          }

      }
}

泛型类:当类中要操作的引用数据类型不确定,早起使用object类,现在使用泛型。

早起使用object类来解决引用数据不确定
这种情况当传入不同的引用数据类型,如果没有进行相应的强转操作,在编译时期没错,运行就会出现错误。


class Worker
{

}
class Student
{

}
class Tools
{
        private Object obj;
        public void setObject(Object obj)
        {
            this.obj=obj;
        }
        public Object getObject()
        {
            return obj;
        }
}



class GenericityDemo1
{
        public static void main(String[]args)
        {
            Tools t=new Tools();
            t.setObject(new Worker());//这时这里换成一个new Student()对象时,则会出现类型转换异常,而必须得将下面强转类型改变
            Worker w=(Worker)t.getObject();

        }
}

使用泛型类之后,如果传入的是不同于泛型的引用数据类型,则会在编译时期就进行报错,来交给程序员处理

class Worker
{

}
class Student
{

}
class Utils<MM>
{
    private MM m;
        public void setObject(MM m)
        {
            this.m=m;
        }
        public MM getObject()
        {
            return m;
        }

}




class GenericityDemo1
{
        public static void main(String[]args)
        {
            Utils <Worker>u=new Utils<Worker>();
            u.setObject(new Worker());//如果这里换为Student()等其他类,则会在编译时出错。
            u.getObject();

        }
}

*泛型方法
定义普通方法时必须要指定传入参数的类型,当定义泛型方法时,就可以定义泛型,可以传入任何类型

静态方法不可以访问类上定义的泛型。
如果静态方法操作的数据类型不确定,可以将泛型定义在静态方法上。
public static void method();泛型必须在返回类型的前面。

class Demo
{
    public <T>void show(T t)
    {
        System.out.println(t);
    }
    public <M>void print(M m)
    {
        System.out.println(m);
    }

}

class GenericityMethod
{
    public static void main(String []args)
    {
        Demo d=new Demo();
        d.show("haha");
        d.show(3.18598);
        d.print(5);
        d.print("tdf");
    }
}

*泛型接口

interface Inter<T>
{ 
     show(T t);
}

泛型限定

import java.util.*;
class Person
{
    private String name;
    Person(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
}
class Student extends Person
{
    Student(String name)
    {
        super(name);
    }

}
class GenericityTest
{
    public static void main(String []args)
    {
        ArrayList<Person> al=new ArrayList<Person>();
        al.add(new Person("dfgd"));
        al.add(new Person("ret"));
        al.add(new Person("fdasdfs"));
        printColl(al);
        ArrayList<Student> al1=new ArrayList<Student>();
        al1.add(new Student("student1"));
        al1.add(new Student("student2"));
        al1.add(new Student("student3"));
        printColl(al1); 
    }
    public static void printColl(ArrayList<? extends Person> al)
    {
        Iterator <? extends Person>it=al.iterator();
        //如果这里只有一个<?>,则会出现没有getName()这个符号的错误,因为<?>
        //返回的是Object,而Object类中并没有getName这个方法,被教程误导了。
        while (it.hasNext())
        {
            System.out.println(it.next().getName());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值