java学习笔记08--泛型

泛型可以解决数据类型的安全性问题,它主要的原理,是在类声明的时候通过一个标识标识类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化的时候只要指定好需要的类型即可。

[java] view plaincopy

  1. class Point<T>{
  2. private T var;     //var的类型由T决定 即由外包决定
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Point<String> p = new Point<String>();  //设置为String类型
  13. Point<Integer> p2 = new Point<Integer>();  //设置为Integer类型
  14. p.setVar("itmyhome");
  15. //p2.setVar("hello");  //p2设置为Integer类型  如果传入String类型就错误
  16. System.out.println(p.getVar());
  17. }
  18. }

构造方法中使用泛型

构造方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造设置属性内容的时候,那么构造方法的定义与之前并无不同,不需要像声明类那样指定泛型。

[java] view plaincopy

  1. class Point<T>{
  2. private T var;     //var的类型由T决定 即由外包决定
  3. public Point(T var){
  4. this.var = var;
  5. }
  6. public T getVar() {
  7. return var;
  8. }
  9. public void setVar(T var) {
  10. this.var = var;
  11. }
  12. }
  13. public class T {
  14. public static void main(String[] args) {
  15. Point<String> p = new Point<String>("itmyhome");  //设置为String类型
  16. System.out.println(p.getVar());
  17. }
  18. }

设置多个泛型

[java] view plaincopy

  1. class Point<K,V>{
  2. private K key;
  3. private V value;
  4. public K getKey() {
  5. return key;
  6. }
  7. public void setKey(K key) {
  8. this.key = key;
  9. }
  10. public V getValue() {
  11. return value;
  12. }
  13. public void setValue(V value) {
  14. this.value = value;
  15. }
  16. }
  17. public class T {
  18. public static void main(String[] args) {
  19. Point<String,Integer> p = new Point<String,Integer>();
  20. p.setKey("itmyhome");
  21. p.setValue(23);
  22. System.out.println(p.getKey());
  23. System.out.println(p.getValue());
  24. }
  25. }

泛型的安全警告

通配符

匹配任意类型的通配符

在开发中对象的引用传递是最常见的,但是如果在泛型类的操作中,在进行引用传递的时候泛型类型必须匹配才可以传递,否则是无法传递的。

[java] view plaincopy

  1. class Info<T>{
  2. private T var;
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Info<String> info = new Info<String>();   //设置泛型类型为String
  13. info.setVar("itmyhome");
  14. <span style="color:#ff0000;">fun(info);      </span>//此处无法传递类型不匹配
  15. }
  16. public static void fun(Info<Object> obj){  //接受Object泛型类型的info对象
  17. System.out.println(obj.getVar());
  18. }
  19. }

使用?通配符

[java] view plaincopy

  1. class Info<T>{
  2. private T var;
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Info<String> info = new Info<String>();   //设置泛型类型为String
  13. info.setVar("itmyhome");
  14. fun(info);
  15. }
  16. public static void fun(Info<?> obj){  //接受?泛型类型的info对象
  17. //obj.setVar("change");  //使用?只能接受 不可以修改
  18. System.out.println(obj.getVar());
  19. }
  20. }

如果使用?意味着可以接受任意的内容,但是此内容却无法直接使用<?>修饰的泛型对象进行修改。

受限泛型

之前设置泛型类型的时候,实际上都是可以任意设置的,只要是类就可以设置,但是在java的泛型中可以指定一个泛型的上限和下限

在引用传递中,泛型操作中也可以设置一个泛型对象的范围上限和范围下限。范围上限使用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类,而范围下限使用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object类。

设置上限

[java] view plaincopy

  1. class Info<T>{
  2. private T var;
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Info<Integer> info1 = new Info<Integer>();
  13. Info<Float> info2 = new Info<Float>();
  14. Info<String> info3 = new Info<String>();   //定义泛型类型为String
  15. info1.setVar(23);
  16. info2.setVar(50.0f);
  17. info3.setVar("itmyhome");
  18. fun(info1);
  19. fun(info2);
  20. fun(info3);     //泛型上限设置为Number 无法进行传递
  21. }
  22. public static void fun(Info<? extends Number> obj){  //只能接受Number及其Number的子类
  23. System.out.println(obj.getVar());
  24. }
  25. }

设置下限

[java] view plaincopy

  1. class Info<T>{
  2. private T var;
  3. public T getVar() {
  4. return var;
  5. }
  6. public void setVar(T var) {
  7. this.var = var;
  8. }
  9. }
  10. public class T {
  11. public static void main(String[] args) {
  12. Info<String> info1 = new Info<String>();
  13. Info<Object> info2 = new Info<Object>();
  14. Info<Integer> info3 = new Info<Integer>();
  15. info1.setVar("itmyhome");
  16. info2.setVar("object");
  17. info3.setVar(23);
  18. fun(info1);
  19. fun(info2);
  20. fun(info3);   //泛型下限受限 ,无法进行传递
  21. }
  22. public static void fun(Info<? super String> obj){  //只能接受String和Object类型的泛型
  23. System.out.println(obj.getVar());
  24. }
  25. }

解释:泛型与子类继承的限制

一个类的子类可以通过对象的多态性,为其父类实例化,但是在泛型操作中,子类的泛型类型是无法使用父类的泛型类型接受的,例如:Info<String>不能使用Info<Object>接受

泛型接口

之前的所有操作都是在类中直接使用泛型操作的,那么,对于java来说,也可以直接在接口中定义及使用泛型。

泛型接口实现的两种方式

定义子类,在子类的定义上也声明泛型类型

[java] view plaincopy

  1. interface Info<T>{            //在接口上定义泛型
  2. public T getVar();        //定义抽象方法 抽象方法的返回值就是泛型类型
  3. }
  4. class InfoImpl<T> implements Info<T>{    //定义泛型接口的子类
  5. private T var;
  6. public InfoImpl(T var){
  7. this.var = var;
  8. }
  9. public T getVar() {
  10. return var;
  11. }
  12. public void setVar(T var) {
  13. this.var = var;
  14. }
  15. }
  16. public class T {
  17. public static void main(String[] args) {
  18. Info<String> info = new InfoImpl<String>("itmyhome");
  19. System.out.println(info.getVar());
  20. }
  21. }

如果现在实现接口的子类不想使用泛型声明,则在实现接口的时候直接指定好操作的类型即可。

[java] view plaincopy

  1. interface Info<T>{            //在接口上定义泛型
  2. public T getVar();        //定义抽象方法 抽象方法的返回值就是泛型类型
  3. }
  4. class InfoImpl implements Info<String>{    //定义泛型接口的子类,直接指定类型
  5. private String var;
  6. public InfoImpl(String var){
  7. this.var = var;
  8. }
  9. public String getVar() {
  10. return var;
  11. }
  12. public void setVar(String var) {
  13. this.var = var;
  14. }
  15. }
  16. public class T {
  17. public static void main(String[] args) {
  18. Info info = new InfoImpl("itmyhome");
  19. System.out.println(info.getVar());
  20. }
  21. }

泛型方法

[java] view plaincopy

    1. class Demo{
    2. public<T> T fun(T var){
    3. return var;
    4. }
    5. }
    6. public class T {
    7. public static void main(String[] args) {
    8. Demo d1 = new Demo();
    9. Demo d2 = new Demo();
    10. System.out.println(d1.fun("itmyhome"));
    11. System.out.println(d2.fun(23));
    12. }
    13. }
时间: 2024-10-07 00:17:41

java学习笔记08--泛型的相关文章

Java学习笔记_26_泛型概述

                                                               泛型概述 在Java中存入容器中的对象再取出时需要转换类型,因为对象加入容器会被转换成Object类型,而取出时要转换成实际类型.但向  下类型转换都 是存在潜在危险的,因此应该尽量避免它们.  Java的泛型: 所谓泛型就是在定义(类.方法.形参.成员变量等等)的时候,指 定它们为通用类型,也就是数据类型可以是任意类型. 泛型为提高大型程序的类型安全和维护带来了很大的潜

Java学习总结-08 泛型

一 泛型(Generic) 1 泛型介绍 1 泛型是在JDK1.5以后增加的新功能.泛型(Generic) 2 泛型可以解决数据类型的安全性问题,主要的原理,是在类声明的时候通过一个标识,表示类中某个属性的类型或者是某个方法的返回值及参数类型. 3 格式: 访问权限 class 类名称<泛型,泛型...>{ 属性 方法 } 4 对象的创建 类名称<具体类型> 对象名称 = new 类名称<具体类型>(); 一般表示泛型使用大写的字母 T . 5 例子不使用泛型以前,怎么

黑马程序员——JAVA学习笔记九(泛型)

1,    泛型机制是JAVA5才支持,使用泛型机制编写的代码比那些杂乱地使用Object变量,然后再强制类型转换的代码具有更好的安全性和可读性. 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用,在泛型出来以前,泛型程序设计是继承Object来实现的.但是有缺点:1,当获取一个值必须要强制类型转换.2,没有类型检查错误,运行时才会出错.泛型提供了类型参数,解决了此问题.   2,    定义泛型类(generic class).格式: public class Pair<T, U>

java学习笔记10--泛型总结

java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note10.html,转载

java学习笔记 第二篇 核心技术(二)

第十四章 集合类 集合类用来存放对象的引用.继承关系如下图: 14.1 Collection 接口 是层次结构中的根接口,构成Collection的单位称为元素.Collection接口不能直接使用,但该接口提供了添加元素.删除元素.管理数据的方法. Collection接口常用方法: 14.2 List 集合 包括List接口以及List集合的所有实现类.List集合中的元素允许重复,各元素循序就是对象插入的顺序 1.List接口,两个重要方法: get(int index): 获取指定索引位

java学习笔记 5

随手 看到了这篇关于Java到底哪里出了问题的文章,笑傻了23333 “Java developers just can’t help themselves it seems - give em an inch, and next thing you know you’re looking at a OO hierarchy 15 layers deep and instantiating a hammer hammer factory.” 继承 Java中的继承用extends,所有的继承都是

Java学习笔记(2015.7.27~7.31)

Java学习笔记(2015.7.27~7.31) Java 课堂 Java学习笔记(2015.7.27~7.31) 小技巧 常用方法 1.List另一个子类--LinkedList 2.数组的常用方法 3.排序 1.二分法查找 2.数组转换为List 3.可变参数Type ... param (了解) 1.容器Collection 2.自动拆装箱(了解) 3.JDK增强for循环(了解) 4.泛型(掌握) 5.iterator与for在迭代中的区别 1.概念:保存多个对象的对象. 2.JDk为什

Java学习笔记3-操作符

Java基本操作符:+.-.*./.%.=.==.!=.+=.-=. 优先级:先乘除后加减,如果是连接符+号会优先往前匹配,比如 a+++++b,会被解释称 a++ ++ +b,所以会报错,需要自行使用括号隔离为 (a++) + (++b). 对象的引用如果赋值给了对象的引用后,2 个对象将指向同一个引用,有一个对象的引用重新赋值后将同时影响到另一个对象,比如 ClassName classA = new ClassName(); ClassName classB = new ClassName

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

Java学习笔记心得——初识Java

初识Java 拿到这本厚厚的<Java学习笔记>,翻开目录:Java平台概论.从JDK到TDE.认识对象.封装.继承与多态...看着这些似懂非懂的术语名词,心里怀着些好奇与担忧,就这样我开始走进Java的世界.  Java产生的历史 Java来自于Sun公司的一个叫Green Project中撰写的程序语言,全球信息网(World Wide Web)兴起,Java Applet成为网页互动技术的代表,特别适合于Internet应用程序开发. Java语言的特点 1.面向对象 这是Java最重要