jjzjj

java - Java 中的协变返回类型

下面的代码使用了Java中方法覆盖的概念。packagepkg;importjava.util.ArrayList;importjava.util.List;abstractclassSuperClass{abstractpublicListgetList();}finalclassSubClassextendsSuperClass{privateListlist=null;@OverridepublicArrayListgetList(){list=newArrayList();list.add("A");list.add("B");return(ArrayList)list;}}f

c# - C# 4.0 中的协变和逆变推理

当我们在C#4.0中定义接口(interface)时,我们可以将每个通用参数标记为in或out。如果我们尝试将通用参数设置为out并且这会导致问题,编译器会引发错误,不允许我们这样做。问题:如果编译器有办法推断协变(out)和逆变(in),为什么我们必须这样标记接口(interface)?仅仅让我们像往常一样定义接口(interface),并且当我们尝试在客户端代码中使用它们时,如果我们尝试以不安全的方式使用它们会引发错误,这还不够吗?示例:interfaceMyInterface{Tabracadabra();}//worksOKinterfaceMyInterface2{Tabra

Java协变返回类型

为什么下面的代码打印“1”?classA{intx=1;}classBextendsA{intx=2;}classBase{AgetObject(){System.out.println("Base");returnnewB();}}publicclassCovariantReturnextendsBase{BgetObject(){System.out.println("CovariantReturn");returnnewB();}/***@paramargs*/publicstaticvoidmain(String[]args){Basetest=newCovariantRetu

java - 接口(interface)中的协变返回类型未通过 Javac 编译

我有以下结构:publicinterfaceBarReturn{}publicinterfaceFooReturn{}publicinterfaceFooBarReturnextendsFooReturn,BarReturn{}publicinterfaceFoo{FooReturnfooBar();}publicinterfaceBar{BarReturnfooBar();}publicinterfaceFooBarextendsFoo,Bar{FooBarReturnfooBar();}Javac失败并显示以下消息:FooBar.java:2:typesBarandFooarein

java - 为什么 void 在 Java 中不是协变的?

如果我有这个界面:publicinterfaceFoo{voidbar();}为什么我不能这样实现?publicclassFooImplimplementsFoo{@OverridepublicObjectbar(){returnnewObject();}}似乎void应该与所有事物都是协变的。我错过了什么吗?编辑:我应该更清楚我正在寻找设计理由,而不是它无法编译的技术原因。让void对所有事物都协变会产生负面影响吗? 最佳答案 void仅与void协变,因为theJLSsaysso:Amethoddeclarationd1with

c# - Java 中 C# IEnumerable 的等价物是什么?具有协变能力的,而不是可迭代的

这种协变在C#中是可能的:IEnumerablea=newList();IEnumerableb=newList();a=b;...classA{}classB:A{}这在Java中是不可能的:(可迭代:在这个问题中看到JavaArrays&Generics:JavaEquivalenttoC#IEnumerable)。Iterablea=newArrayList();Iterableb=newArrayList();a=b;...classA{}classBextendsA{}使用Iterable,Java看不到这两个集合是协变的Java中哪个可迭代/可枚举接口(interface)

c# - C# 中的协变有哪些类型? (或者,协方差 : by example)

协变性(大致)是在使用“简单”类型的复杂类型中镜像继承的能力。例如。我们总是可以处理Cat的实例作为Animal的实例.ComplexType可能被视为ComplexType,如果ComplexType是协变的。我想知道:协方差的“类型”是什么,它们与C#有什么关系(是否支持它们?)代码示例会有所帮助。例如,一种类型是返回类型协方差,Java支持,但C#不支持。我希望有函数式编程能力的人也能插话! 最佳答案 这是我能想到的:更新在阅读了EricLippert提出(和撰写)的建设性评论和大量文章后,我改进了答案:更新了数组协方差的破损

c++ - std::tr1::function::target<TFuncPtr> 和协变/逆变

因为我喜欢用C#和C++编程,所以我打算实现一个类似C#的事件系统,作为我计划的C++SFML-GUI的坚实基础。这只是我的代码的摘录,我希望这能澄清我的概念://Event.h//STLheaders:#include#include#include//boostheaders:#include#includenamespaceUtils{namespaceGui{#defineIMPLEMENTS_EVENT(EVENTNAME,EVENTARGS)public:\Utils::Gui::IEvent&EVENTNAME(){returnm_on##EVENTNAME;}\prot

c++ - `shared_ptr` 是如何实现协变的?

可以复制或构建shared_ptr来自shared_ptr(即shared_ptrptr=make_shared())。但众所周知,模板类不能相互转换,即使模板参数可以。那么如何才能shared_ptr检查它们的指针的值是否可转换,如果是则进行转换? 最佳答案 是的,默认情况下同一类模板的特化几乎没有关系,基本上被视为不相关的类型。但是您始终可以通过定义转换构造函数(To::To(constFrom&))和/或转换函数(From::operatorTo()const)来定义类类型之间的隐式转换。那又如何std::shared_ptr

c++ - [C++]协变返回类型

我有一个VectorN类和一个继承自VectorN的Vector3类(例如,它可以处理叉积)。我无法确定不同运算符的返回类型。示例:classVectorN{public:VectorN(){};virtualVectorNoperator*(constdouble&d){.....};std::vectorcoords;};classVector3:publicVectorN{public:Vector3(){};virtualVector3operator*(constdouble&d){....};};此特定示例产生C2555错误:'Vector3::operator*':ove