首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -存在协变和逆变吗?

Java -存在协变和逆变吗?
EN

Stack Overflow用户
提问于 2013-03-06 12:27:49
回答 1查看 979关注 0票数 2

前几天,当涉及到泛型和协方差/逆方差时,我有点困惑。我知道C#指定了协变/逆变类型参数,但是在Java语言中真的有类似的概念吗?

我知道你可以声明:

代码语言:javascript
复制
List<? extends String> l = ...
List<? super String> l2 =...

现在l可以获取MyString的列表,add方法是不允许的等等,而l2可以获取List<Object>并向其添加字符串,但不能获取任何元素,如这里所述的Covariance- contravariance in Java。然而,这只是简单地声明了一个带有接受subtyes/超类型的类型参数的列表,而不是像这样做“适当的”协方差:

代码语言:javascript
复制
Iterable<Animal> a = new Iterable<Dog>();

是我搞混了,还是Java根本不支持正确的协方差定义?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-03-06 12:54:24

Java的类型变化是在使用站点,而不是在声明站点。假设我们有一个类型声明

代码语言:javascript
复制
interface List<E>

我们可以协变使用它(在原始语法中)

代码语言:javascript
复制
List<+Animal> animals = new ArrayList<Dog>();

类型变量上的+注释使参数化类型协变。

这一点都不坏。我们也可以有对比的List<-Animal>。它更加灵活。

不幸的是,Java设计者高估了Java程序员的愚蠢,他们认为单个字母符号+/-会让我们发疯;我们必须看到英文单词才能理解到底发生了什么。在Java中,冗长仍然是值得庆祝的时刻。所以我们得到这个语法

代码语言:javascript
复制
List<? extends Animal>

我认为这是绝对的智障。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15238997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档