问题标签 [covariant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2803 浏览

c++ - 协变返回类型

$10.3/5

“覆盖函数的返回类型应与被覆盖函数的返回类型相同或与函数的类协变。如果函数 D::f 覆盖函数 B::f,则函数的返回类型如果它们满足以下标准,则它们是协变的:

— 两者都是类的指针或类的引用 98)

— B::f 的返回类型中的类与 D::f 的返回类型中的类是同一类,或者是 D 的返回类型中的类的明确且可访问的直接或间接基类: :F

指针或引用都具有相同的 cv 限定,并且D::f 的返回类型中的类类型具有与 B::f 的返回类型中的类类型相同或更少的 cv 限定。

我写了上面的实验代码,发现 Comeau 的错误/警告不一致。第 9 行中的警告似乎表明返回类型中的 cv 限定符没有意义。正是这个原因导致代码格式错误。

所以问题是,Comeau 在第 9 行发出“警告”信息是否正确?我知道这是一种实现定义的行为,Comeau 只是想表现得很好。但在这种情况下,它充其量是令人困惑的。

0 投票
2 回答
548 浏览

java - 为什么 Java 5+ API 不利用协变返回类型?

从 Java 5 开始,我们可以使用协变返回类型。为什么 Java API 不利用这一点?

举个Graphics2D.create()例子。为什么不重写它以返回一个Graphics2D对象?在我看来,它在所有情况下都是向后兼容的。

0 投票
2 回答
204 浏览

c# - C# 泛型协变错误

以下是我的代码,我不知道为什么 DateTime 不能更改为 Object ,有什么办法解决这个问题吗?

0 投票
1 回答
764 浏览

java - Java协变返回类型不适用于枚举实例的覆盖方法?

我在 Google 上花了很长时间来查找有关此主题的一些信息,但是与 Java 枚举和协变返回类型相关的结果几乎不存在。

那么:是否可以将协变返回类型与枚举方法一起使用,您在枚举类中定义一个方法,然后在实例中覆盖它,如下所示:

然后像这样利用协方差:

在这种情况下,编译器对我的枚举定义很好,但测试用例无法编译,说 Object 不能转换为 Integer(或 String)。显然编译器只查看方法的基本定义,而不是覆盖方法。使用不同的枚举定义,我有基本方法抽象,但这仍然不起作用。

我认为这与在编译过程中转换枚举的方式有关,这会阻止它工作,但我想确定不仅仅是我在做一些愚蠢的事情。

请注意,这个测试用例无疑是非常人为的,在我的实际枚举中,这个功能会更有用。如有需要,我可以发布。

0 投票
4 回答
7652 浏览

c++ - 虚函数的不同返回类型

虚函数的返回类型应该与基类中的类型相同,或者是协变的。但是为什么我们有这个限制呢?

0 投票
1 回答
674 浏览

java - 抽象类A有没有更好的解决方案?

我想重写一个方法并将它采用的参数替换为该参数的子类。

对于返回类型没有问题,因为它们不是方法签名的一部分,可以用子类替换(称为“协变返回类型”)。对于参数,这是行不通的,因为它们是签名的一部分。

所以我想出了使用相同类型的泛型参数的解决方案:

但是“公共抽象类 A”这句话在我看来很奇怪。还有其他方法可以实现这一目标吗?任何“协变参数类型”?:-)

0 投票
3 回答
1524 浏览

java - java协变返回类型

为什么下面的代码打印“1”?

0 投票
1 回答
258 浏览

generics - Scala - 协变类型层次结构的根

以下 Scala 类:

有效地定义了一个以 Foo[Bar] 为根的类型层次结构——即任何有效的 Foo[X] 都可以分配给 Foo[Bar] 值或变量:

FooBase 更进一步,也可能暗示不是 Foo 的对象 - 以下显示了问题:

...而且 FooBase 不知道类型 T,因此它的成员无法指定它,我必须在 Foo 中覆盖这些定义以专门化它们:

还有其他方法可以解决这个问题,但重点应该很清楚。

最后,我的实际问题是以下层次结构的根源是什么:

同样,不要告诉我 FooBase,因为事实并非如此。是的,我可以专门为此目的在两者之间插入另一个类,但这仍然不是一个真正的答案,如上所述。

Scala 不喜欢 just Foo(没有类型参数),也不Foo[_]是,因为返回类型参数类型的值的访问方法实际上是Any,而不是Foo。当然,我们也不能这样做Foo[Foo],因为这也缺少第二个的类型参数,Foo[Foo[_]]或者Foo[Foo[Foo[Foo[_]]]只能让我们获得这么多级别。

是否有答案,或者 Scala 是否缺乏对此的支持?

提前致谢!

0 投票
3 回答
10294 浏览

c# - 协变泛型参数

我试图理解这一点,但我没有从搜索中得到任何适当的结果。

在 C# 4 中,我可以做到

这与

我所知道的是out使通用参数协变(??)。<out T>有人可以举例说明零件的用法吗?还有为什么只适用于接口和委托而不适用于类?

对不起,如果它是重复的,如果是,请关闭它。

0 投票
6 回答
1449 浏览

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

我有以下结构:

Javac 失败并显示以下消息:

但是,Eclipse 可以很好地编译它,据我所见,它应该可以编译——FooBar 的 fooBar() 方法通过使用协变返回来满足 Foo 和 Bar 的 fooBar() 方法的约定。

这是 Eclipse 编译中的错误还是 javac 中的错误?或者有没有办法说服 javac 编译它?作为参考,我的 javac 选项如下所示: