Java 基础知识
1.java 泛型
1) 协变,就是父类和子类保持相同形式的变化,但是协变有时候被支持,有时候不被支持
比如,在数组中,协变是支持的 比如
class Parent{}
class Child extends Parent{}
那么 Child[]可以赋值给 Parent[] ,这个就是协变
但是,在泛型中,协变就不可以 比如 虽然Child extends Parent 但是,假设有个 Test<T>,则 Test<Child>不可以赋值给Test<Parent>,这2者毫无关系
2)使用泛型的过程中,经常出现一种很别扭的情况。比如按照题主的例子,我们有
Fruit 类,和它的派生类Apple类。然后有一个最简单的容器:Plate类。盘子里可以放一个泛型的“东西”。我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法。现在我定义一个“水果盘子”,逻辑上水果盘子当然可以装苹果。但实际上Java编译器不允许这个操作。会报错,“装苹果的盘子”无法转换成“装水果的盘子”。所以我的尴尬症就犯了。实际上,编译器脑袋里认定的逻辑是这样的:
苹果IS-A水果
装苹果的盘子NOT-IS-A装水果的盘子
所以,就算容器里装的东西之间有继承关系,但容器之间是没有继承关系的。所以我们不可以把Plate<Apple>的引用传递给Plate<Fruit>。为了让泛型用起来更舒服,Sun的大脑袋们就想出了<? extends T>和<? super T>的办法,来让”水果盘子“和”苹果盘子“之间发生关系。
2. 什么是上界?下面代码就是“上界通配符(Upper Bounds Wildcards)”:
3. merge != null && merge == true,必须先判空,再比较值,否则会报空指针错误