Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
100mango committed May 12, 2020
1 parent 6714d2d commit cb92d44
Show file tree
Hide file tree
Showing 2 changed files with 157 additions and 4 deletions.
54 changes: 52 additions & 2 deletions A glance At Java/a glance at java.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,31 @@ class Student extends Person {
java 是单继承的。


另外一个特别的地方,就是 Java 的构造方法是不支持继承的。

~~~java

class A {

public int a;
A(int a) {
this.a = a;
}

}

class B extends A {
/*不写就会报错 */
B(int a) {
super(a);
}
}
~~~

> If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass. If the super class does not have a no-argument constructor, you will get a compile-time error. Object does have such a constructor, so if Object is the only superclass, there is no problem.



### 多态

~~~java
Expand All @@ -83,6 +108,9 @@ covariant return type

类似于 SwiftProtocol, Java 对应的Interface.

Java8 后, JavaInterface 能够提供默认实现。


`anonymous class`


Expand Down Expand Up @@ -193,9 +221,18 @@ Java定义了一种名字空间,称之为包:package。一个类总是属于

除基本类型外,所有类型都是引用类型,并且都是 `java.lang.Object` 的子类。

值得注意的是

不可变对象 ()
#### 不可变对象

这个其实就类似 OCNSString, 理解很简单,就是不能对这个对象做任何的修改。

~~~
String s1 = "ab";
String s2 = s1;
s1 = s1 + "c"; // 实际上这里, s1 已经指向了一个新的字符串对象了
System.out.println(s1 + " " + s2);
// abc ab
~~~



Expand All @@ -212,5 +249,18 @@ The predefined annotation types defined in java.lang are @Deprecated, @Override,



## 泛型 Generics

In a nutshell, generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. Much like the more familiar formal parameters used in method declarations, type parameters provide a way for you to re-use the same code with different inputs. The difference is that the inputs to formal parameters are values, while the inputs to type parameters are types.


这段解释还不错。

Java 的泛型是 invariant 的




#### 参考资料:


107 changes: 105 additions & 2 deletions A glance At Java/类型系统.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,112 @@ s = s + Integer.toString(20);



## 协变 逆变 Covariance and contravariance
## Covariance (协变), contravariance (逆变 ) 和 Invariance (不变)


在编程语言设计之初,设计者需要确定好类型系统对 协变 逆变 的支持和规则。
在编程语言设计之初,设计者需要确定好类型系统对 `协变` `逆变` 的支持和规则。

variance 是差异,不同,变化的意思。

加上前缀 co , co 表示共同。 `covariance` 代表共同的变化,翻译到中文变为协变。

加上前缀 contra , contra 表示相反。 `contravariance` 代表相反的变化,翻译到中文为逆变。

加上前缀 in, in 表示否定 ,`invariance` 代表不变。


看到这里,相信大家还是非常茫然, 这些拗口的词语究竟代表什么含义。

这些词语,实际上用于描述: **父类,子类之间相互替换的规则**


### Covariance 父类可被子类替代


在面向对象编程中,我们学习继承,多态时,经常会看见这样的示例代码:

~~~java
//Java
Animal cat, dog;

car = new Cat();
dog = new Dog);
~~~

也即我们能将子类对象赋值给父类类型的变量。 也即声明为父类的变量,能被`替换`为子类对象。

这种规则的术语就叫 covariance。 covariance 代表,申明为父类的地方,可以直接传入子类对象来使用。 大家平时都习以为常了。 所以当遇到有地方声明为父类,传入子类类型的时候,就会觉得比较惊讶。 实际真正要彻底了解就是要看这门语言对它类型系统所做的定义。

#### Contravariance 子类可被父类替代

而 contravariance, 则反过来, 申明为子类的地方, 可以直接传入父类对象来使用。

这个规则比较令人费解。实际上主流语言也比较少支持。 Swift 支持。


我们用一个方法定义来捋清楚。

假设有类型 A, Asubclass

假设有方法:

method1: (A) -> Void

method2: (Void) -> A

method3: (Asubclass) -> Void

那么不同编程语言, 对参数类型,返回值类型 **父类,子类之间相互替换的规则** 有不同的规定:

1. Covariant return type.

method2 = (Void) -> Bsubclass

2. Contravariant parameter type

method3 = (A) -> Void

3. Coavariant parameter type

method1 = (Asubclass) -> Void

~~~kotilin
class Animal {
void chase(Animal x) { ... }
}
class Mouse extends Animal { ... }
class Cat extends Animal {
void chase(covariant Mouse x) { ... }
}
~~~











#### Invariance 类型之间不具备替代关系



### class, func, Generic









### Java 对协变,逆变 的支持


第一次看到这个是学习java 时看到: covariant return type
Expand All @@ -129,6 +231,7 @@ s = s + Integer.toString(20);

[](https://medium.com/@aunnnn/covariance-and-contravariance-in-swift-32f3be8610b9)

[](https://docs.microsoft.com/en-us/dotnet/standard/generics/covariance-and-contravariance)


### OC
Expand Down

0 comments on commit cb92d44

Please sign in to comment.