java学习笔记9.22(泛型)

泛型代码与虚拟机:

自动提供原始类型,擦除类型变量,替换为限定类型(无则用object)

当调用泛型方法时,编译器对返回的object进行强制类型转换

泛型类擦除造成原本在泛型类子类中覆盖的方法变成了重载。(参数类型变成了object)导致子类出现了同一方法名两种参数的方法,调用时本来只希望调用子类的方法(多态),结果有可能调用了泛型超类中的参数为objec的方法。编译器自动在子类中加入桥方法:

public void setSecond(object a){setSecond((Date) a)}

同样在有返回类型的方法中,也会产生两个相同参数类型的方法。虚拟机根据参数类型和返回类型确定一个方法。

一个方法覆盖另一个方法时可以指定一个更加严格的返回类型。

1 虚拟机中没有泛型,只有普通类和方法;2 所有类型参数都用他们的限定类型替换 3 桥方法保持多态 4为保持安全性,必要时插入强制类型转换

允许泛型代码和遗留代码之间能够互操作。

泛型的约束与局限(大多由擦除引起):

1.不能用基本类型实例化类型参数,objec不能储存double的值。

2.运行时的类型查询只适用于原始类型。使用instanceof,getcalss或泛型类型的强制转化时,都是类型擦除后的效果。

3.不能创建参数化类型的数组:Pair<String>[] table=new Pair<String>[10]//error,擦除机制将会导致table数组中可以插入任意的Pair<otherclass>

4.Varargs警告,向参数可变的方法传递一个泛型类型的实例。由于个数可变参数实际上是一个数组,所以会违反第三条,但是只会得到一条警告。

5.不能实例化类型变量:(如果想通过T来构造对象)

new T(),T.class//both error

public Pair(){first=new T();second=new T();}//error

saddly,由于不能调用T.class:

first=T.class.newInstance()也是错误的

如果非要通过反射调用Class.newInstance来构造泛型对象:在Pair中新建一个泛型方法,由于Class本身是泛型,String.class是Class<String>的一个实例


public static <T> Pair<T> makePair(Class<T> cl){
  try{return new Pair<>(cl.newInstance(), cl.newInstance()) ;}
  catch(Exception ex){return null;}
}调用:Pair<String> p = Pair.makePair(string.class);

不能构造一个类型变量的数组:

public static <T> T[] minmax(T[] a){T[] mm = new T[2];....}//error

6. 泛型类的静态上下文中类型变量无效

7. 不能抛出或捕获泛型类的实例:

泛型类cannot extend throwable;不能catch类型变量(声明中可以throws类型变量)

。。。。

泛型类型的继承规则:

Pair<employee>和Pair<manager>之间没有关系

Pair<employee> b=Pair<manager> a //error

假设可以转换,则会出现可以在b中存储低级别雇员(由于没有保护)

注意数组和泛型的区别,如果一个manager[]数组赋值给employee[]变量a,则这个变量会带有特别的保护,即低级别雇员无法存储到a[0]。

Pair<Employee>时原始类型Pair的一个子类型

泛型类可以扩展或实现其他的泛型类。如ArrayList<T>实现了List<T>接口。

通配符类型:

时间: 2024-08-28 05:31:08

java学习笔记9.22(泛型)的相关文章

Java学习笔记九(泛型)

1.介绍 所谓的泛型就是将类型作为一种参数来传递,有了泛型后类型不再是一成不变的,可以通过泛型参数来指定.可以提供程序开发的灵活性. 2.泛型类或接口的使用 泛型类声明时,与普通类没有太大的区别,只是在类中加入了类型变量的声明 public class 类名<类型变量>{..........................................................................} <span style="font-family:SimS

我的java学习笔记(10)关于泛型数据列表

1.ArrayList是一个采用类型参数的泛型类. 2.为了指定数组列表保存的元素对象类型,需要用一对尖括号将类名括起来加在后面. ArryList<a> s = new ArrayList<a>();//右边尖括号里的参数可以省略 3.使用add方法将元素添加到数组列表中. s.add(a()); 4.数组列表管理着对象引用的一个内部数组.如果调用add且内部数组已经满了,数组列表就将自动的创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大的数组中. 5.还可以把出事容量

Java学习笔记_26_泛型概述

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

JAVA之GUI编程概述学习笔记(22)

      下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式:                                 1.GUI                2.CLI; GUI:Grahi User Interface ,图形用户界面.                       特点:用图形的方式,来显示计算机操作的界面,这样更方便更直观. CLI: Command line User Interf

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学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep

Java学习笔记之接口

一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(String msg); } 定义接口使用关键字interface 修饰符interface前面的public可以省略,如果省略,则采用默认访问控制,即只有在相同包结构的代码才可以访问此接口 接口不可以有构造方法(区别于类中的构造方法) 接口里面的所有成员,包括常量.方法等都是public访问权限,所以在