关于泛型那些事?

关于泛型那些事?

 1.关于 泛型 和 子类继承 :

   对于以前关于继承而言,其中子类和父类可以进行类型转换,这就是我们常说的类型转换(向上转型和向下转型)。其中我们知道将父类转换为子类需要进行强制类型转换的。而子类可以直接向上转型转换。

    如下代码:

Object obj = null; String str = “123”;  obj = str; 这是完全正确的!

  那么关于泛型涉及到子类继承需要怎么做呢?如下代码:

  List<Object> objs = null; List<String> strs = new ArrayList<String>(); objs = strs //编译错误

  objs = strs;是错误的,他们是不能进行类型转换的,这是为什么呢?我们可以通过反证法可知,当我们假设其是可以进行类型转换的!我们可知 strs 向上转换为 objs,也就是说现在我们可以在该类型中存储任何类型的数据!这就又有我们为什么要设计泛型的初衷违背了!我们在设计泛型时就是为了使在集合中进行封装数据时可以只封装一种类型的数据。故而其是错误的。

这时我们可以知道 List<Object> 不是 List<String> 的父类,那什么样的类型是  List<String> 的父类呢?这时就引入了 List<?> 来代表父类!,它的元素类型可以匹配任何类型。显然,? 它被称为通配符。下面我们来看将任意元素加入到带通配符的类中不是类型安全的这又是为什么?

Collection<?> c = new ArrayList<String>();

c.add(new Object()); // 编译时错误。

这是因为我们不知道c 中存放的元素类型(c中可以存放任何类型的数据如String、Math、Date类型等等),我们不能向其中添加对象。add 方法有类型参数E 作为集合的元素类型。我们传给add 的任何参数都必须是一个未知类型的子类。因为我们不知道那是什么类型,所以我们无法传任何东西进去。唯一的例外是null,它是所有类型的成员。

所以使用通配符是较为灵活,但是在使用通配符时,却要为此付出使用通配符的灵活性的代价的!即使你使用有限制的通配符也是同理。如下面的例子:

  List<? extends Shape>是有限制通配符的一个例子。这里?代表一个未知的类型,就像我们前面看到的通配符一样。但是,在这里,我们只是知道这个未知的类型实际上是Shape 的一个子类。我们说 Shape 是这个通配符的上限(upper bound)。

如下代码:

    public void addRectangle(List<? extends Shape> shapes) {

    shapes.add(0, new Rectangle()); // compile-time error!

    }

  为什么编译错误?这是因为,我们不知道它是不是Rectangle 的父类;它可能是也可能不是一个父类,所以这里传递一个Rectangle 不安全。

 2.  如何定义泛型类或接口?

其实对于泛型类或接口的定义来说,我们可以参考 List<E> 的源码中的定义,其中我们要注意的是泛型的位置!!!我们需要在类名的后面紧跟着进行定义泛型,其中我们称紧跟在类名后面的泛型我们称为类型参数类型参数在整个类的声明中可用,几乎是所有可以使用其他普通类型的地方(如: 返回值、方法的参数、方法内部的局部变量、定义在类中的全局变量。)其中我们也可以定义多个类型参数!

如下面的代码:

       public interface List<E> { //定义泛型。

           void add(E x);  //声明泛型后可用到 方法的参数

           Iterator<E> iterator(); //声明泛型后可用到 返回值类型

       }

    public interface Iterator<E> { //定义泛型。

       E next();//声明泛型后可用到 返回值类型

       boolean hasNext();

    }

 3.  如何定义泛型方法?

那又如何定义泛型方法呢?那么接下来就说一下,其中我们可以在普通类或者泛型类中定义泛型方法!不仅仅是在泛型类中可以定义,这点我们是要明白的,如下定义的泛型方法:

  Public <T> T name(T t,String str){

  T tt = null;

   return tt;

  }

故而我们可以知道类型参数在整个方法的声明中可用,几乎是所有可以使用其他普通类型的地方(如: 返回值、方法的参数、方法内部的局部变量。)

以上总结还有不足之处,欢迎朋友们批评指正!!!

时间: 2024-10-13 02:57:10

关于泛型那些事?的相关文章

Java泛型和通配符那点事

泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象. 因为Map.get()被定义为返回Object

net 自定义泛型那点事

泛型概述 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型.泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念. 泛型定义 泛型的定义主要有以下两种: 1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象.(这是当今较常见的定义) 2.在程序编码中一些包含参数的类.其

.NET编程01(泛型)

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

JAVA泛型详解——转

泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象. 因为Map.get()被定义为返回Object

机房重构——泛型集合

敲三层的时候就听师傅说过泛型,只不过当时没有特别的注意.当敲用户登录窗体时,我遇到这样的问题,就是我们需要经过验证输入的信息的正误之后才能登录或者不能登录.判断时,需要返回我们从数据库中查到的信息,那么问题就来了,如何返回呢? 一开始我一直用的是DataTable返回数据的,但是当去判断的时候我不知道如何下手了,按照以往的经验,我们可以使用table.rows()或table.field(),具体的实现方法可以自己试验一下.这种方法虽然可以实现,可是里面重复的内容太多了,尤其是每次使用一个字段时

Lua程序设计 泛型for的定义

泛型for在循环过程内部保存了迭代器函数.实际上他保存着3个值:一个迭代器函数.一个恒定状态和一个控制变量. 泛型for的语法如下:   for <var-list> in <exp-list>  do   end  其中,<var-list>是一个或多个变量名的列表,以逗号分隔:<exp-list>是一个或多个表达式的列表,同样以逗号分隔.通常表达式列表只有一个元素,即一句迭代器工厂的调用.    for k, v in pairs(t) do print

Java 中的泛型详解-Java编程思想

Java中的泛型参考了C++的模板,Java的界限是Java泛型的局限. 2.简单泛型 促成泛型出现最引人注目的一个原因就是为了创造容器类. 首先看一个只能持有单个对象的类,这个类可以明确指定其持有的对象的类型 class Holder1 { private Circle a; public Holder1(Circle a) { this.a = a; } Circle get() { return a; } } 上面的类的可重用性不怎么样,无法持有其他类型的任何对象,下面通过持有Object

java 泛型 窜讲

一.为什么使用泛型      复用性:泛型的本质就是参数化类型,因而使用编写的泛型代码可以被许多不同类型的对象所复用.      安全性:在对类型Object引用的参数操作时,往往需要进行显式的强制类型转换.这种强制类型转换需要在运行时才能被发现是否转换异常,通过引入泛型能将在运行时才能检查类型转换,提前到编译时期就能检查. 二.自定义泛型 java中自定义泛型分为三种:泛型类.泛型接口.泛型方法. 下面使用一个案例演示泛型类.泛型方法,泛型接口类似,所以不再演示. // 自定义泛型类publi

1月21日 - (转)Java 泛型

java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象. 因为 M