1.类的内部有不肯定的属性,能够用范型来表示数组
2.某个参数竟然限制性,好比必须是谁的子类,或必须是谁的父类。ui
简单泛型:spa
1.最多见的泛型应用应该是 容器类和数组了3d
2。对象
定义范型变量的时候使用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>传参也能够