草庐IT

Contravariance

全部标签

java - 在像 Stream.reduce() 这样的 API 中选择不变性的充分理由是什么?

审查Java8StreamAPI设计,我对Stream.reduce()上的通用不变性感到惊讶论据:Ureduce(Uidentity,BiFunctionaccumulator,BinaryOperatorcombiner)同一个API的一个看似更通用的版本可能对U的各个引用应用了协变/逆变。,如:Ureduce(Uidentity,BiFunctionaccumulator,BiFunctioncombiner)这将允许以下情况,目前这是不可能的://Assumingwewanttoreusethesetoolsallovertheplace:BiFunctionnumberAdd

java - Java泛型中如何使用逆变?

在Java中,协方差允许API设计者指定实例可以泛化为某种类型或该类型的任何子类型。例如:Listshapes=newArrayList();//wheretypeCircleextendsShape逆变换反了。它允许我们指定一个实例可以泛化为某种类型或父类(superclass)型。Listshapes=newArrayList();//whereShapeextendsGeometryJava泛型的逆变性有何用处?你会选择什么时候使用它? 最佳答案 这是来自JavaGenericsandCollections的相关摘录:2.4。

java - Java泛型中如何使用逆变?

在Java中,协方差允许API设计者指定实例可以泛化为某种类型或该类型的任何子类型。例如:Listshapes=newArrayList();//wheretypeCircleextendsShape逆变换反了。它允许我们指定一个实例可以泛化为某种类型或父类(superclass)型。Listshapes=newArrayList();//whereShapeextendsGeometryJava泛型的逆变性有何用处?你会选择什么时候使用它? 最佳答案 这是来自JavaGenericsandCollections的相关摘录:2.4。

generics - Kotlin 泛型类型参数

源码如下funmain(args:Array){println("Hello,world!")valmutableIntList=mutableListOf(1,2,3)addInt(4,mutableIntList)//Nocompile-timeerroraddAnotherInt(5,mutableIntList)//Compile-timeerrorprintln(mutableIntList)}funaddInt(item:T,list:MutableList){list.add(item)}funaddAnotherInt(item:T,list:MutableList){

generics - Kotlin 泛型类型参数

源码如下funmain(args:Array){println("Hello,world!")valmutableIntList=mutableListOf(1,2,3)addInt(4,mutableIntList)//Nocompile-timeerroraddAnotherInt(5,mutableIntList)//Compile-timeerrorprintln(mutableIntList)}funaddInt(item:T,list:MutableList){list.add(item)}funaddAnotherInt(item:T,list:MutableList){

generics - Kotlin 中的逆变

我从来没有真正理解Java中的泛型,所以Kotlin似乎就是这种情况。考虑以下代码片段(这是一个人为的示例):classAnyComparator:Comparator{overridefuncompare(o1:Any,o2:Any):Int{TODO("notimplemented")}}funtest(){valx:Comparator=AnyComparator()//OK!valy:Comparator=AnyComparator()//Compilationerror}第二次分配失败并出现错误Typemismatch.Required:kotlin.ComparatorFo

generics - Kotlin 中的逆变

我从来没有真正理解Java中的泛型,所以Kotlin似乎就是这种情况。考虑以下代码片段(这是一个人为的示例):classAnyComparator:Comparator{overridefuncompare(o1:Any,o2:Any):Int{TODO("notimplemented")}}funtest(){valx:Comparator=AnyComparator()//OK!valy:Comparator=AnyComparator()//Compilationerror}第二次分配失败并出现错误Typemismatch.Required:kotlin.ComparatorFo

scala - @uncheckedVariance 在 Kotlin 中?

在他的演讲中CompilersareDatabases,MartinOdersky提出了一个有趣的方差极端案例:classTree[-T]{deftpe:T@uncheckedVariancedefwithType(t:Type):Tree[Type]}T被定义为逆变的,因为将类型树(Tree[Type])视为无类型树(Tree[Nothing]),但不是相反。通常,Scala编译器会提示T显示为tpe方法的返回类型。这就是Martin使用@uncheckedVariance注释关闭编译器的原因。这是翻译成Kotlin的示例:abstractclassTree{abstractfunt

scala - @uncheckedVariance 在 Kotlin 中?

在他的演讲中CompilersareDatabases,MartinOdersky提出了一个有趣的方差极端案例:classTree[-T]{deftpe:T@uncheckedVariancedefwithType(t:Type):Tree[Type]}T被定义为逆变的,因为将类型树(Tree[Type])视为无类型树(Tree[Nothing]),但不是相反。通常,Scala编译器会提示T显示为tpe方法的返回类型。这就是Martin使用@uncheckedVariance注释关闭编译器的原因。这是翻译成Kotlin的示例:abstractclassTree{abstractfunt

java - 用简单的英语解释协变、不变和逆变?

今天,我阅读了一些关于Java中的协变、逆变(和不变性)的文章。我阅读了英文和德文Wikipedia文章,以及IBM的其他一些博客文章和文章。但我仍然对这些到底是什么感到有些困惑?有人说是关于类型和子类型之间的关系,有人说是关于类型转换,有人说它是用来决定一个方法是被覆盖还是被重载。所以我正在寻找简单的英语解释,向初学者展示协方差和逆变(和不变性)是什么。加分是一个简单的例子。 最佳答案 Somesayitisaboutrelationshipbetweentypesandsubtypes,othersayitisabouttype