JavaSE:泛型总结

对于jdbc的总结,我想等我忘记一段时间再来总结,就像现在我对JavaSE部分的总结和回顾,我感觉这样有个好处,你会对这个知识有更加深刻的理解,比如我学jdbc的时候在泛型的使用上有很多迷惑的地方,现在返回来看,记忆和理解更加深刻了。

泛型(Generics):

泛型的出现:since JDK1.5

IBM的DW中给的解释我认为很好:

Generics是程序设计语言的一种技术,指将程序中数据类型进行参数化,它本质上是对程序的数据类型进行一次抽象,扩展语言的表达能力,同时支持更大力度的代码复用。

思维扩散一下:

Java总抽象类,接口是不是就是这样的思想,将类进行抽象化,扩展了语言的表达能力,更大力度的支持了代码复用。

总结:

Generics——>对数据类型(引用类型)进行抽象

abstract Class/interface——>对类进行抽象

共性:抽象。

优点:提高了代码的复用性。

ps:这就总结了一下。。。。!

为什么要使用泛型?

我们要向一个List中添加一些学生的学号:

    List list = new ArrayList();
    list.add(100);
    list.add(101);
    list.add(102);
    //但是我比较调皮,就想把我名字给加进去
    list.add("雷锋");

    //我们来遍历,看看同学们的学号
    for(Object object : list){
        int sId = (Integer)object;//强制类型转换和自动拆箱
        System.out.println(sId);
    }

发现在编译的时候报错了,是因为雷锋这位同学比较调皮,ClassCastException

为了解决这种对数据的破坏和强制类型转换可能报异常的问题,所以我们就有了泛型。

看看使用泛型后:

    List<Integer> list = new ArrayList<>();//since JDK1.7
    list.add(100);
    list.add(101);
    list.add(102);
    //但是我比较调皮,就想把我名字给加进去
    list.add("雷锋");

    //我们来遍历,看看同学们的学号
    for(Integer sid : list){
        System.out.println(sId);
    }

发现雷锋这位调皮的同学添加不进去了,编译报错了。

泛型的使用:

1.集合中使用泛型

2.自定义泛型类,泛型接口,泛型方法

3.泛型与继承的关系

4.通配符

集合中使用泛型:

具体的就不多说了,在使用的时候,相信大家都深有体会。特别是像我一样,见不得一点点的警告,总要思考为什么要出现这样的警告。结果我的所有代码都没有一点警告。

自定义泛型类:

可以参考集合中泛型类的使用,不知道的可以参考API中集合部分。

public class Order<T>{
    private int id;
    private String name;
    private T t;
    List<T> list = new ArrayList<T>();

    public void add(T t){
        list.add();
    }
    public void setT(T t){
        this.t = t;
    }

    public T getT(){
        return t;
    }

    public void setId(int id){
        this.id = id;
    }

    public void getId(){
        return id;
    }
    .
    .
    .
    //name 属性的get和set方法一样,不写了。
}

自定义接口与之类似,不再赘述。

泛型方法:

还是上面的例子,加入一个泛型方法:

public class Order<T>{
    private int id;
    private String name;
    private T t;
    List<T> list = new ArrayList<T>();

    public void add(T t){
        list.add();
    }
    public void setT(T t){
        this.t = t;
    }

    public T getT(){
        return t;
    }

    public void setId(int id){
        this.id = id;
    }

    public void getId(){
        return id;
    }
    .
    .
    .
    //name 属性的get和set方法一样,不写了。

    //泛型方法
    public <E> E getE(E e){
        return e;
    }
}

注意看泛型方法的声明。和泛型类,泛型接口有所不同。

泛型和类的继承关系:

    Object obj = null;
    String str = "hellowrold";
    obj = str;

这样的方式,我们知道可以通过编译,可以运行,多态的使用(向上转型),在看下面:

    List<Object> list = null;
    List<String> list2 = new ArrayList<>();
    list2.add("zhangsan");
    list2.add("lisi");

    list = list2;

这里编译会报错 mismatch,类型不匹配。

—–>若类A是类B的子类,那么List<A> 就不是List<B> 的子接口

—–>list2和list不具备继承关系

—–>带泛型的类不具备继承关系,他们是同级关系

—–?哪我要向Object添加别的类型的该怎么办?

List<T extends Object>

可以理解为一种小于等于的关系

而还有一种使用方式(不是针对上面的问题):

List<T super Number>

可以理解为一种大于等于的关系

引用上面的一句话:

带泛型的类不具备继承关系,他们是同级关系

——>那有没有一个类是所有泛型类的父类呢?

通配符:?

List<A>,List<B> 是 List<?>的子类

? extends A :可以存放A及其子类或子接口

? super B :可以存放B及其父类或父接口

注意一点:使用通配符的类,只能写,而不能读(null除外)

总结一下,使用中需要理解和注意的地方:

1.上面所说的参数化,其实就是泛型的意思。

2.对象实例化时,不指定泛型,默认为Object

3.泛型的引用之间不能相互赋值

4.加入集合中的泛型元素必须和指定的泛型类型一致

5.静态方法中不能使用泛型

理解:静态方法的先于对象而存在,可以直接通过类名来调用,调用的时候还没有明确泛型的类型是什么,所以不能使用泛型。

6.不能再cathch中使用泛型,编译报错

7.从泛型类派生子类,子类需具体化

泛型核心思想:

将类或接口中的数据限制为一个特定的数据类型

最后来一个泛型的使用的例子:

用户在设计类的时候往往会使用类的关联关系,例如,一个人中可以定义一个信息的属性,但是一个人可能有各种各样的信息(如联系方式、基本信息等),所以此信息属性的类型就可以通过泛型进行声明,然后只要设计相应的信息类即可。

interface Info{
}
public class Contact implements Info{
    private String address;
    private Stirng phone;
    private String zipCode;

    //无参构造器

    //有参构造器

    //get and set method

    //toString()方法

}
public class Inroduction implements Info{
    private String name;
    private String sex;
    private int age;

   //同上

}
class Person<T extends Info>{
    private T info;

    public Person(T info){
        this.info = info;
    }

    //get and set method

    //toString()
}
public class GenericPerson{
    public static void main(String[] args){
        Person<Contact> per = new Person<>(new Contact("Beijign", "88888888888", "000000"));
    }
        System.out.println(per);

        Person<Introduction> per2 = new Person<>(new Introduction("Jay", "M", 23))
        System.out.println(per2);
}
时间: 2024-08-08 05:16:14

JavaSE:泛型总结的相关文章

【javaSE】Java泛型机制

************************************************************************   ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************ Java泛型机制 泛型是JavaSE5 引入的特性,泛型的本质是参数化类型.应用场景:在类,接口和方法的定义过程中,所操作的数据类

JavaSE入门学习40:Java集合框架之泛型

一Java泛型 JDK 4.0以前装入集合的类型不明确,也就是说集合中的元素,可以是任意类型的对象(对象的引用),如果把某个 对象放入集合,则会忽略它的类型,而把它当做Object处理,从而失去自己的实际类型.从集合中取出时往往需要转 型,效率低,容易产生错误.JDK 5.0泛型指的是规定了某个集合只可以存放特定类型的对象,会在编译期间进行类 型检查,也可以直接按指定类型获取集合元素. 如果我们只写一个排序方法,就能够对整型数组.字符串数组甚至支持排序的任何类型的数组进行排序,这该多 好啊.Ja

【JavaSE】day04_Collection_Iterator_新循环_泛型

1.Collection集合的批量操作 1)boolean addAll(Collection c) 将给定的集合中的所有元素添加到当前集合中. 当执行完毕后,当前集合中的元素发生改变则返回true. 2)boolean containsAll(Collection c) 判断当前集合中是否包含给定集合里的所有元素,全部包含则返回true. 这里判断的依据依然是依靠元素的equals比较的. 代码演示: package day04; import java.util.ArrayList; imp

javaSE(九)之泛型(Generics)

前言 这几天分享了怎么搭建集群,这一篇给大家介绍的是泛型,在我们的很多java底层的源代码都是有很多复杂的泛型的!那什么是泛型呢? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引入泛型的好处是安全简单.在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转

一、javaSE (十六)List的子类、泛型、增强for循环、静态导入、可变参数

1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数組,查迿快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数組,查询快,增删慢 线程安全,效率低 LinkedList: 底层数据结枃是链表,查询慢,增删快 线程不安全,效率高 (2)Arraylist A:没有特有功能需要学习 B:案例 a: Arraylist存储字符串并遍历 b: Arraylist存储自定义对象并遍历 (3)Vector A:特有功能 a:添加: public void

JavaSE笔记-泛型

定义带泛型的类 public class Cat<T> { //可以用T定义实例变量 private T name; //可以用T定义形参 //构造器没有<> public Cat(T name){ this.name = name; } //可以作为返回值 public T forget(){ System.out.println("我叫啥来着?"); return this.name; } public static void main(String[] a

JAVASE(十五) 泛型 :泛型用例、自定义泛型类、通配符

1.泛型在集合中的使用 1.1 在集合中使用泛型之前的例子 ? 为什么要有泛型(Generic)? 1. 解决元素存储的安全性问题2. 解决获取数据元素时,需要类型强转的问题 ? ? 1.2 在集合中使用泛型例子1 List<String> list = new ArrayList<String>(); list.add("aaaa"); List<Integer> list2 = new ArrayList<Integer>(); li

android 使用泛型再也不写findViewById方法了

我们在开发中肯定会findViewById寻找view,如果一个界面上有很多view需要绑定click事件,那么findViewById就是个体力活了,那我们就想能不能有一种办法能不能不必要每次去findViewById呢?只要你去想,说明你就意识到这个问题,剩下来就是想办法如何解决了,这个问题也不能,如果熟悉javase中的泛型,就会很简单的解决,代码入下 public <T> T $(int viewID) { return (T)findViewById(viewID); } 我们只要在

javase基础

目录 目录... 1 第一天... 5 1:计算机概述(了解) 5 2:键盘功能键的认识和快捷键(掌握) 5 3:常见的DOS命令(掌握) 6 4:Java语言概述(了解) 6 5:JDK,JRE,JVM的作用及关系(掌握) 7 6:JDK的下载,安装,卸载(掌握) 7 7:第一个程序:HelloWorld案例(掌握) 7 8:常见的问题(掌握) 8 9:path环境变量(掌握) 8 10:classpath环境变量(理解) 8 第二天... 10 1:关键字(掌握) 10 2:标识符(掌握)