泛型 总结

介绍


泛型:jdk1.5出现的安全机制。

好处:将运行时期的问题ClassCastException转到了编译时期,避免了强制转换的麻烦。

什么时候用:

当操作的引用数据类型不确定的时候。就使用<>。将要操作的引用数据类型传入即可。

其实<>就是一个用于接收具体引用数据类型的参数范围。

在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型。

泛型技术是给编译器使用的技术,用于编译时期。确保了类型的安全。 运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。 为什么擦除呢?因为为了兼容运行的类加载器。 泛型的补偿:在运行时,通过获取元素的类型进行转换动作。不用再强制转换了。
泛型的通配符【?】未知类型。 泛型的限定: 【? extends E】接收E类型或者E的子类型对象。上限。一般存储对象的时候用。比如 添加元素 addAll。 【? super E】接收E类型或者E的父类型对象。下限。一般取出对象的时候用。比如比较器。
泛型由来 Java语言类型包括八种基本类型和复杂类型,复杂类型包括类和数组。 早期Java版本(1.4之前)如果要代指某个泛化类对象,只能使用Object,这样写出来的代码需要增加强转,而且缺少类型检查,代码缺少健壮性。在1.5之后,Java引入了泛型(Generic)的概念,提供了一套抽象的类型表示方法。利用泛型,我们可以: 1、表示多个可变类型之间的相互关系:HashMap<T,S>表示类型T与S的映射,HashMap<T, S extends T>表示T的子类与T的映射关系 2、细化类的能力:ArrayList<T> 可以容纳任何指定类型T的数据,当T代指人,则是人的有序列表,当T代指杯子,则是杯子的有序列表,所有对象个体可以共用相同的操作行为 3、复杂类型被细分成更多类型:List<People>和List<Cup>是两种不同的类型,这意味着List<People> listP = new ArrayList<Cup>()是不可编译的。后面会提到,这种检查基于编译而非运行,所以说是不可编译并非不可运行,因为运行时ArrayList不保留Cup信息。另外要注意,即使People继承自Object,List<Object> listO = new ArrayList<People>()也是不可编译的,应理解为两种不同类型。因为listO可以容纳任意类型,而实例化的People列表只能接收People实例,这会破坏数据类型完整性。 4、简化代码实现:假设有一个执行过程,对不同类型的数据,进行某些流程一致的处理,不引入泛型的实现方法为:

泛型的定义与使用


public class Test {

    public static void main(String[] args) {

        Person<Boolean> person = new Person<Boolean>();

        System.out.println(person.getValue());

        person.setValue(true);

        System.out.println(person.getValue());

        person.show("包青天");

        Person.staticShow(9);

        InterImpl<Date> in2 = new InterImpl<Date>();

        in2.show(new Date());//重写的方法  Tue Sep 27 17:06:47 CST 2016

    }

}

class Person<QQ> { //将泛型定义在【类】上。作用范围为本类中

    private QQ q; //QQ代表要操作的引用数据类型

    public QQ getValue() {

        return q;

    }

    public void setValue(QQ q) {

        this.q = q;

    }

    public <W> void show(W str) {//将泛型定义在【方法】上,作用范围为本方法中。放在返回值之前

        System.out.println(str.toString());

    }

    public static <Y> void staticShow(Y obj) {//当方法位静态时,不能访问类上定义的泛型。如果要使用泛型,只能将泛型定义在方法上

        System.out.println(obj);

    }

}

//******************************************************************************************

interface Inter<T> {//将泛型定义在【接口】上

    public void show(T t);

}

class InterImpl<Q> implements Inter<Q> {

    public void show(Q q) {

        System.out.println("重写的方法  " + q);

    }

}

泛型的限定


public class Test {

    public static void main(String[] args) {

        ArrayList<Object> al = new ArrayList<Object>();

        al.add("白乾涛");

        al.add(true);

        al.add(20094);

        printCollection(al);

        ArrayList<Student> al2 = new ArrayList<Student>();

        al2.add(new Student("白乾涛"));

        al2.add(new Student("包青天"));

        printCollection2(al2);

    }

    public static void printCollection(Collection<?> al) { //【?】代表可以是未知类型。这里的通配符效果其实和泛型一致

        Iterator<?> it = al.iterator();

        while (it.hasNext()) {

            System.out.println(it.next().toString());

        }

    }

    public static <T> void printCollection2(Collection<T> al) {

        Iterator<T> it = al.iterator();

        while (it.hasNext()) {

            System.out.println(it.next());

        }

    }

    public static void printCollection3(Collection<? extends Person> al) {//【? extends E】接收E类型或者E的子类型对象。【? super E】接收E类型或者E的父类型对象

        Iterator<? extends Person> it = al.iterator();

        while (it.hasNext()) {

            System.out.println(it.next());

        }

    }

}

//************************************************************************************

class Person {

    public String name;

    public int age;

    public Person(String name, int age) {

        super();

        this.name = name;

        this.age = age;

    }

    @Override

    public String toString() {

        return name + "-" + age;

    }

}

class Student extends Person {

    public Student(String name) {

        super(name, 26);

    }

}

来自为知笔记(Wiz)

时间: 2024-12-07 05:21:09

泛型 总结的相关文章

.NET编程01(泛型)

一:Object 类型:一切类型的父类,通过继承,子类拥有父类一切属性和行为:任何父类出现的地方,都可以用子类来代替: 用一个方法来完成多个方法做的事 /// <summary>    /// 普通方法类    /// </summary>    public class CommonMethod    {        /// <summary>        /// 打印个int值        /// </summary>        /// <

c#系统泛型委托

Action<T> 无返回值的系统泛型委托 namespace ConsoleApp1 { public class UserInfo { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } class Program { private static List<UserInfo> getInit() { return new List<User

泛型2

万用字符(wildcard) 以动物Animal类为例,怎样才能创建出一种ArrayList<?>里面既可以保存ArrayList<Dog>,又可以保存ArrayList<Cat>? public void takeAnimals(ArrayList<? extends Animal> animals){  //泛型中extends同时代表继承和实现. for(Animal a : animals){ a.eat(); } } 我们可以这样调用该函数: Ar

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质 import java.lang.reflect.Method; import java.util.ArrayList; /** * 通过反射了解集合泛型的本质 * @author shm * */ public class MethodDemo02 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("hello"); list.add(

构造方法中使用泛型

------------siwuxie095 构造方法中使用泛型: 构造方法可以为类中的属性初始化,如果类中的属性通过泛型指定,而又需要 通过构造方法设置属性内容的时候,构造方法的定义与之前并无不同,不需要 像声明类那样指定泛型 package com.siwuxie095.generic; class Context<T>{ private T value; public Context(T value) { this.value=value; } public T getValue() {

泛型委托当参数传递

假如有一个Person类: public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Title { get; set; } } 执行一个方法: /// <summary> /// 传递一个泛型委托方法 /// </summary> /// <param name="acti

类库,委托,is和as运算符,泛型集合

类库:其实就是一堆类文件,只不过用户看不到这些类的源代码,保密性好. 优点:保密性好缺点:如果这个方法不好用,使用者无法自己去更改它. 类文件是.cs    类库是.dll 新建项目为类库,在debug文件夹下找到dll文件 委托:委托可以理解为:函数的指针 关键词:delegate 声明委托类型:public delegate int FirstDel(int a, int b); FirstDel不是类,是委托变量,不能实例化(不能new), 创建委托变量:FirstDel 名字 = 与这个

泛型委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 泛型委托 { public delegate int DelCompare<T>(T t1, T t2); // public delegate int DelCompare(object o1, object o2); class Progra

java 16-8 泛型高级之通配符

泛型高级(通配符) ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了 ? extends E:向下限定,E及其子类 ? super E:向上限定,E极其父类 1 import java.util.ArrayList; 2 import java.util.Collection; 3 public class GenericDemo { 4 public static void main(String[] args) { 5 // 泛型如果明确的写的时候,前后必须一致 6 C

蓝鸥Unity开发基础二——课时21 泛型

本节课我们来学习C#中的泛型,泛型是一个特殊的类型,它可以最大限度的重用我们的代码! 推荐视频讲师博客:http://11165165.blog.51cto.com/ 使用泛型能够最大限度的重用代码,保护类型安全,提高性能 泛型成员因为类型的不确定性,不能使用算术运算符,比较运算符 类型参数可以有多个,可以是编译器能够识别的任何类型 类型参数的名字不能够随便起,不能重名 一.数组类Array using System; namespace Lesson_21{    //数组类Array