黑马程序员_java06_泛型

本文详细介绍了Java泛型的概念、好处、定义方法、使用场景,并深入探讨了泛型参数的限定,包括上界、下界以及通配符的使用,通过示例代码展示如何在实际开发中灵活运用泛型。

——- android培训java培训、期待与您交流! ———-

泛型也被称为参数化类型,就是在定义类,接口和方法时,规定了创建将要处理的对象类型。泛型更多地体现在集合的应用上,用于表明集合元素的类型限制。

泛型的好处:
1.将运行时期出现的问题ClassCaseException,转移到了编译时期,方便于程序员解决问题。让运行时间减少安全。
2.避免了强制转换的麻烦。

1.定义简单的泛型类

API中有大量的泛型类与泛型接口等。定义泛型只需要在声明类时在类名后使用(E可以是任何其他字母)的形式指定该类是一个泛型类,E称为类型参数,类型参数可以在该类中需要数据类型的都地方使用,如属性声明,方法声明等。在具体使用该类时,E可以使用任何一个具体类型替代。

泛型格式: 通过<>定义要操作的引用数据类型。

在使用java提供的对象时,什么时候写泛型?

通常在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用于接收类型的。当使用集合时,将集合中要储存的数据类型作为参数传递到<>中即可。

import java.util.*;
class GenericDemo 
{
    public static void main(String[] args) 
    {
        TreeSet<String> ts=new TreeSet<String>();
        ts.add("java01");
        ts.add("java02");
        ts.add("java03");
        ts.add("java04");
        Iterator<String> it=ts.iterator();
        while (it.hasNext())
        {
            System.out.println(it.next());
        }
    }
}

集合TreeSet中定义了泛型,TreeSet全部是String类型,若是非String类型的,无法传入。

泛型参数的限定

一个类通过泛型 参数定义,实现了处理对象的普遍性,这是优点,但是也有缺点。前面的泛型类,泛型接口及泛型方法的定义存在一个缺陷,就是由于参数的类型是未知的,只能在运行时确定下来,因此,就限制了泛型类对目标对象的处理能力。因为泛型类只能将其视为Object类型的实例进行处理,无法更有效地使用参数实力本身所能够提供的方法或者属性。通过使用参数类型的边界限定,可以有效地解决这个问题。

1.定义泛型参数的上界

通过使用extends关键字,可以限定泛型参数的类型上界,声明如下:

public class StudentDemo<T ? extends Person>

上面的方法规定了StudentDemo类所能处理的参数类型和Person有继承关系,这样程序中就会这种关系,将T声明的变量视为Person类型,从而利用了Person类型的特征进行工作。另外,extends 关键字所声明的上界即可以是一个类,也就是一个接口。这一点和接口的实现关键字是不同的。

2.定义泛型参数的下界

通过使用个super关键字可以固定泛型参数的类型为某种类型或者其他超类,例如:

List<? super Person> listP=new ArrayList<T>();

当程序希望为一个方法的参数限定类型时,通常可以使用下限通配符。通过JDK提供数组排列方法sort()。

3.通配符
“?”符号声明参数类型可以是任何一个类型,它和参数T的含义是有区别的。T表示一个未知类型,而“?”表示任何一个类型。这种通配符一般有一下三种用法:
(1)单独的 ? ,用于表示任何类型。
(2)?extends type ,表示带有上界。
(3)?super type ,表示带有下界。

import java.util.*;
class GenericDemo8 
{
    public static void main(String[] args) 
    {
        ArrayList<Person> al=new ArrayList<Person>();
        al.add(new Person("zhangsan1",3));
        al.add(new Person("zhangsan2",3));
        al.add(new Person("zhangsan3",3));
        printColl(al);
    }
    public static void printColl(ArrayList <? extends Person> al)
    {
        Iterator<? extends Person> it=al.iterator();
        while (it.hasNext())
        {
            //System.out.println(it.next().getName());
            //System.out.println(it.next().getAge());
            Person p=it.next();
            System.out.println(p.getName()+"\t"+p.getAge());
        }
    }
}
class Person
{
    private int age;
    private String name;
    Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
    public void setAge(int age)
    {
        this.age=age;
    }
    public int getAge()
    {
        return age;
    }
}
class Student extends Person
{
    Student(String name,int age)
    {
        super(name,age);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值