JAVA编程思想学习(十五章)泛型

范型的使用场景:

1.类的内部有不肯定的属性,能够用范型来表示数组

2.某个参数竟然限制性,好比必须是谁的子类,或必须是谁的父类。ui

 

简单泛型:spa

1.最多见的泛型应用应该是 容器类和数组了3d

2。对象

3.本身定义一个泛型类

定义范型变量的时候使用T(Type)  E(Element) K,V(键值),一目了然,见名思意,   若是定义的时候使用String 会怎么样呢?blog

String类就被覆盖了,  String这个名字就指的范型类了。继承

//使用时不指定范型  不指定默认就是Object接口

//继承泛型类的时候get

1.能够给父类直接 定义范型类型(String),也能够不定义,不定义默认就是Object  ,固然也能够继 续使用<T>编译器

2.本身依旧不能直接指定String 仍是会覆盖String

//实现范型接口与继承范型类差很少规则以下:

//范型申明 不具有继承关系

举例以下:

 

//看下方这段有意思的代码

这段代码颇有趣, FancyToy的父类是 Toy   你不能Class<Toy> up = ftClass.getSuperClass(),必须用Class<? super FancyToy>up = ftClass.getSuperclass();  这里只能用这种模糊的处理因此  Object obj = up.newInstance(); 因此他的实例也只能用Object来接收

 

范型擦除:

范型的应用一般是在编译期完成的,在执行阶段已被擦除

 

4.如下这4种写法的区别要理解:

第三种 个人引用变量是范型String ,而NEW出来的是Object 因此直接转型了。

第四种  个人引用变量是Object ,而new出来的是范型String ,因此又被强转为Object了

 

5。没法直接经过范型建立范型数组, 可是有个小技巧能够实现,以下图

 

// 小知识

obj  instanceof   TYPE

能够用 Class.isInstance(clazz) 替代

 

 

 

2 泛型类  和 泛型方法

泛型方法能够存在于泛型类中,也能够存在于普通的类中,没什么关系

泛型方法的格式:在返回值前面加<类型参数>

public <T> void f(T x)

使用泛型类时,必须在建立对象的时候指定类型参数的值,而使用泛型方法的时候,一般没必要指明参数类型,由于编译器会为咱们找出具体的类型。这称为类型参数推断。所以咱们能够像调用普通方法同样调用f(),并且就好像是f()被无限次地重载过。他甚至能够接受类自己。

<? extends T>泛型的类型自动推断只是用于赋值,传参可不行

class Fruit {}

class Apple extends Fruit{}

那么  fruit[] fruit = new Apple[10];  编译可行!!

运行时会抛出异常!

 

这种范型集合,会致使你没办法添加任何对象,由于你不知道添加进去的倒地是什么类型,可是你要是get  是能够的, 至少编译器知道 get的都是Fruit

<? super Apple> 诈一看就好像<? extend Apple>的反义词,但其实不是他们是同义词  前者的意思是 Apple是该类型参数的爸爸,  后者的意思是某个Aplle的儿子

<? super T>传参也能够

相关文章
相关标签/搜索