首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐式通配符

隐式通配符
EN

Stack Overflow用户
提问于 2013-10-11 12:03:48
回答 2查看 189关注 0票数 4

this topic中,我面临的是内嵌类型。

问题1.在中,隐式类型的防御是什么?还是它是非正式概念?我可以手动定义隐式类型吗?所有隐式类型都是相同的,是真的吗?编译器的隐式类型是什么?

以下代码示例:

代码语言:javascript
复制
List<? extends Number> nums= new ArrayList<Integer>();
nums.add(3);//error

我知道我们可以将nums引用分配给ArrayList<Double>

问题2.在这个上下文中? extends Number是隐式类型,由CAP#1定义。编译器确实知道只有null是这种隐式类型的实例吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-11 12:19:10

恰当的术语是捕获通配符。编译器在内部将泛型类型的通配符实例化转换为捕获通配符。捕获表示类型参数的特定未知类型。当然,这种特殊的未知类型是通配符所表示的类型家族的成员。

注意,由于可以有许多不同的类型可以用通配符实例化来表示,所以我们说通配符表示一个参数化类型的不同实例化的系列。

我可以手动定义隐式类型吗?

匿名类型变量?不是的。它是由编译器内部创建的。可以这样说,您正在指示编译器创建一个匿名类型参数,该参数将替换使用的通配符。

所有隐式类型都是相同的,是真的吗?

不是的。如果您使用两倍于不同类型的List<? extends Number>,它们都会生成不同的匿名类型,即CAP#1 extends NumberCAP#2 extends Number

编译器的隐式类型是什么?

我不明白这些问题。

编译器确实知道只有null是这种隐式类型的实例吗?

添加null的原因是,null对于任何类型的引用都是一个有效的值。因此,不管通配符所代表的实际类型参数是什么,都会很高兴地接受值null

票数 2
EN

Stack Overflow用户

发布于 2013-10-11 12:13:53

您不能将任何内容放入使用扩展通配符声明的类型中,除非值null,的值为,它属于每个引用类型

代码语言:javascript
复制
List<Integer> ints = Arrays.asList(1,2,3);
List<? extends Number> nums = ints;
nums.add(null); // ok
assert nums.toString().equals("[1,2,3,null]");

通常,如果一个结构包含具有? extends E格式类型的元素,我们可以从结构中获取元素,但是我们不能将元素放入结构中(null除外)。要将元素放入结构中,我们需要super通配符:

代码语言:javascript
复制
    List<Number> nums = new ArrayList<Number>();
    nums.add(2);
    nums.add(3.14);

    List<? super Integer> ints = nums;

    ints.add(3); 
    ints.add(null);

结果:[2, 3.14, null]

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

https://stackoverflow.com/questions/19317697

复制
相关文章

相似问题

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