Java協変性逆変性学習ノート

2847 ワード

オブジェクト向けのコンピュータプログラム言語では、特定の子猫から動物へのタイプ変換(上り変換)、または形状から三角形への変換(下り変換)など、タイプ間の変換がしばしば関連する.
私たちは以前、タイプ自体に注目していましたが、タイプ変換の性質を無視することがよくありました.最近『thinking in java』を拝読して、タイプ変換の性質に関する比較抽象理論の内容を見て、よく研究して、みんなに分かち合います.
共変性(covariance)、逆変性(contravariance)、および無関係性(invariant)の3つのコア名詞をめぐって説明します.これらは、タイプ変換の性質を記述するための用語であり、形式的には以下のように記述されています.
AとBがタイプである場合、fはタイプ変換を表し、≦はサブタイプ関係を表し、(例えば、A≦Bは、AがBであるサブクラスを表す)では、
A≦Bの場合f(A)≦f(B)の場合、fはコヒーレントである
A≦Bであればf(B)≦f(A)であればfは逆である
上の2つが成立しなければfは関係ない
例えばjavaではf(A)=List但是,在这里List宣布如下。class List{……}泛用class List加入了类型电脑T,可以理解把T换成类型电脑List,这个项目本身是类型电脑f.A=Object,B=String,型変换f(A)=List,f(B)=Listの例を挙げる.String≦Objectだがf(A)≦f(b)は成り立たない。因此,上记的类型的变换没有关系。Java语言中,有可以通过协变性和逆变性理解的文法.例としてA=String,B=ObjectはA≦Bf(A)=String[],f(B)=Object[].Object[]objects=new String[n].可以认为配列有咖啡レンス性。X = Y 1.在便利店回归价格的语言中,便利店回归价格的大创,在网络上写了大创的时候,可以把大创的回归价置换为"更窄"标志.(C#不支持这个技术,C++和Java JDK 5.0以后开始支持)例:public static class Super{ Object getSomething() { return null; } } public static class SubClass extends Super { @Override String getSomething() { return null; } }这个故事的主要想法是,萨布克拉斯与亲克拉斯不同的上写信信片需要的回归值协同使用,但回归值有继承关系.接下来表示更好的例子.class Collection { Iterator iterator() { ... } } class List extends Collection { @Override ListIterator iterator() { ... } }Iterator相关数取得了现在的套装的反复器,在沙布克拉斯上,反复器比正确表现,所以作为新的回复值使用Iterator的萨布克拉斯ListIterator.2.网络电视台首先举例,可以马上理解网络电视台的例子,实际上网络电视台的使用环境仍然是继承体系下的相关数来加油.class Super { void doSomething(String parameter) { } } class Sub extends Super { void doSomething(Object parameter) { } }为了更好理解这个问题,首先导入了Liskov Substitution Principle的概念.这个原则的内容可以使用萨布克拉斯的办公室需要父母办公室的地方。这个原则有什么关系和电脑回归值?它将克拉斯定义为以下.class Super { ReturnType doSomething(ParameterType a) { return null; } } class Sub extends Super { ReturnType doSomething(ParameterType a) { return null; } }如果我拥有Super sup的话;首先考虑到电脑,呼吁sup.doSomething(o); 如果2个相关需要的意大利相同的话,也没有值得讨论。根据情况,有时会成为与ParameterType相继相关的另一款克拉斯新ParameterType.如下所述class Sub extends Super { ReturnType doSomething(NewParameterType a) { return null; } }NewParameterTypeがParameterTypeのサブクラスである場合sup.在doSomething(o)呼吁,如果o是指NewParameterType的Object,就没有通过。如果NewParameterType是ParameterType的父母的话,就没有发生问题。所以我提出了网络电视台的概念.同样,即使利用这个原则也可以理解利用.使用环境有以下文件:ReturnType rt=sup.doSomething(o); 如果设计被改变的话,萨布克拉斯需要返回与ReturnType相关的克拉斯NewReturnType,返回ReturnType的父母的话,上记文无法控制.NewReturnTypeがReturnTypeのサブスクライブの場合、Liskovサブスクライブの原則に違反しません。Java泛用Java泛用的话,如果是class DataHolder{}TipA≦B的话,直接使用DataHolder和DataHolder就可以了.但如果利用java提供的无线卡构文的话,可以提供可以转换咖啡链接.DataHolder≦DataHolder例:static boolean find(Iterable<?extends Object>where,Object what){ return false; }可以使用Iterable呼吁find关数.参考資料:http://stackoverflow.com/questions/2501023/demonstrate-covariance-and-contravariance-in-java http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science) http://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html