可以改变<! - ? extends String - >是否包含除Strings之外的任何东西?

时间:2015-08-28 12:42:20

标签: java generics

我对Java很新,在我看来

Iterable<? extends String>

只能是

Iterable<String>

因为String是final,而不能派生自。我错了吗?

5 个答案:

答案 0 :(得分:4)

你的观察是真实有效的,并没有多少补充。

所以我预计下一个问题(正如我在评论中所做的那样,只是作为格式化原因的答案):如果唯一可能的定义是{{1},为什么会使用Iterable<? extends String> }?

说实话:对于Iterable<String>,您没有任何方法可以添加任何内容,因此它没有多大意义。但是,我们可以将Iterable替换为Iterable

ListList<? extends String>之间的区别是什么?

使用List<String>编译器知道该列表包含List<String>个对象,因此它允许您调用String

但是对于add("newStringLiteral"),编译器不再那么肯定了。当然,我们不能扩展List<? extends String>,但编译器不会检查它,因此必须假设它是可能的。

现在让我们假装我们能够写一个班级String。如果我们要调用SpecialString extends String,我们希望将列表限制为仅包含List<? extends String> l = new ArrayList<SpecialString>()个对象。但是编译器只看到SpecialString因此它假设可能对实际类型有限制,因此认为List<? extends String>是错误。

因此,使用add("newStringLiteral")基本上会将参数设为一个列表,您无法添加任何内容(只需读取和删除)。

答案 1 :(得分:3)

其他答案已经解释过您对? extends String的假设是正确的。但是当你提出问题时,有一个问题。

  

Iterable<? extends String>是否可以包含除{。}之外的任何内容   字符串?

您可以轻松构建一个Iterable<String>,它可以包含任何对象,而不仅仅是字符串:

ArrayList a = new ArrayList();
a.add(Boolean.TRUE);

@SuppressWarnings("unchecked")
Iterable<String> i = a; 

Object elem = i.iterator().next();
assert elem == Boolean.TRUE;

答案 2 :(得分:0)

是的,是的。唯一有效的Object将是String。

答案 3 :(得分:0)

这是正确的,String不能扩展,因为它是最终的语句

Iterable<? extends String>

没有多大意义。

答案 4 :(得分:0)

由于string是最后一堂课,所以确实如此。